如题
https://img-ask.csdn.net/upload/201902/25/1551065476_315097.png
2222222222222222222 在 char 型的内存中只保留了 1000 1110,溢出部分数据就丢失了,由于是有符号型,第一位是1表示负数,负数是采用补码形式的,实际数据也就是反码加一,111 0010也就是114,所以x实际值是-114
编译器懒得去做这种东西,所以不会这么做,你得出这个结果的原因是因为你输入的那串数字的低8位被复制到了x中,x是有符号类型(unsigned char是无符号)所以输出的结果负值,你可以用二进制计算器查看一下22222222222222的低8位,然后去除第一位符号位,剩下的应该就是值,这个你还需要考虑到编译器在处理有符号类型的时候是使用源码还是补码存的。反正编译器不会自动去补
有符号变量溢出之后会被反转,比如char型变量,范围是-128~+127,那如果输入128,就溢出了,反转后就变成-128,输入129为-127,输入256就刚好为0, 257就是1, 以此类推,你输入的值2222222222222222222 % 256 = 142,142已经溢出,按照前面的推算应该是-128+(142-128)=-114