话不多说直接上干货:看完这个你百分百不困惑。
我们在这里看见这种赋值首先要想到变量的取值范围,有符号的字符型数值的取值范围是-128~127,无符号的字符型取值范围是0~256,这里a,b为有符号的字符型变量,c,d为无符号的字符型变量。
先看a变量,a是一个正数,在内存中的存储形式是1000 0001(正数的原码反码补码都一样),然后看a的类型,为字符型,一个字节刚好占8个二进制位,然后他又是一个有符号的,看最高位,最高位为1,代表的是一个负值,此时内存中的1000 0001代表的是补码,我们现在需要对其用有符号的十进制形式输出,所以就要转成原码,1000 0001先减一变成反码 1000 0000,然后除开符号位全部取反, 得到原码 1111 1111,此时转成有符号的数就是-127,输出a=-127。
再看b变量,b是一个负数,其原码为1 1000 0001,转成反码1 0111 1110;然后加一转成补码 1 0111 1111,又因为他是一个字符型,占8个二进制位,舍弃最前面的1,变成0111 1111,然后又因为是有符号的(0111 1111)代表一个正数(原码,反码,补码都一样),转成有符号的十进制数输出得127。
再看c,c是一个正数,在内存中存储的二进制形式为1 0000 0001,其原码反码补码都一样,然后看c的类型,为字符型,占八个二进制位,此时变成0000 0001,又因为是无符号型的,最高位为0,代表正数,补充一点这里的0000 0001此时还是补码形势存在的,将其变成原码为0000 0001(他为正数,原码反码补码一样),再用有符号的十进制形式输出为1。
最后看d,d是一个负数,在内存中以补码的形式存在,他的原码为11 0000 0001,反码为 10 1111 1110,然后看他为字符型,占8个二进制位,舍弃前面的10,变成1111 1110然后他又是无符号的,最高位为1,代表正数,其原码反码补码都一样,然后以有符号的十进制形式输出,得255。
总结:先把数转成二进制,然后看类型(char,int等),确定所占字节数,最后看有无符号,从而输出。