原码、反码、补码
char 、signed char 、unsigned char
char [-128 ~ 127]
unsigned char [0 ~ 255] 一定为正数
(1)无符号类型的数:原码,反码,补码是它本身. [正数和0]
(2)有符号类型的数:最高位0表示为正数,1表示为负数。
负数 的反码 = 符号位不变,其他位按位取反
负数 的补码 = 反码 + 1
(3)数据在内存中是以补码的形式存储,%d输出的时候,要求输出数据的原码形式。
例:
char a = 200; //补码:1100 1000 反码、原码正常取反后加1,则原码%d可输出—> -56
char a = 210; //补码:1101 0010 反码、原码正常取反后加1,则原码%d可输出—> -46
unsigned char a = 280 //补码:1 0001 1000 取低8bit
//(补码反码、原码相同)则原码%d可输出—> 24
char = -200; //原码:1 1100 1000
//反码:1 0011 0111
//补码:1 0011 1000 (取低八位,为正数,补码、原码相同0011 1000)
//则原码%d可输出—>56
unsigned char = -1 //原码:1000 0001
//反码:1111 1110
//补码:1111 1111 (转换的反码、原码相同)—>255
总结:
char x / unsugned x
当 x>0 时:补码转原码后输出
当 x<0 时:先原码转补码,再转原码后输出