一不小心钻了牛角尖 ,CHAR 类型相反数的问题
int main()
{
char c = 0;
cout<<(int)c<<endl;
c = -c;
cout<<(int)c<<endl;
char c2 = -128;
cout<<(int)c2<<endl;
c2 = -c2;
cout<<(int)c2<<endl;
}
相反数是怎样计算出来的?是不是单单改变最前面的符号位就可以了?哈哈,真是好笑。
如果是这样,c为0时,二进制为00000000,那-c就应该为10000000,这不变成-128了?
同理,c2为-128时,二进制10000000,则-c2不变成00000000,这不是0吗?
输出结果与想像的不一样。
晕了~~~~~~~
[解决办法]
相反数仅仅只是符号不同的2个数
满足a + b = 0的2个数即互为相反数
结合你的例子:
0的相反数是0容易理解
-128的相反数应该是128 用char(范围-128 至 127)类型是无法表示的,溢出了
[解决办法]
如果是这样,c为0时,二进制为00000000,那-c就应该为10000000,这不变成-128了?
0的相反数应该取0
同理,c2为-128时,二进制10000000,则-c2不变成00000000,这不是0吗?
char是 -128-》127, 128溢出了,溢出的值是多少呢?以下规律:将溢出的值加减256的倍数 使结果在 -128 和 127之间,128的话,就减去256等于-128
129的话减去256得到-127......
[解决办法]
lz应该补补基础了
相反数的称谓我没听过,a和-a是取补的关系,好象是叫补,记不清了
计算方法是,取反再加1
比如0x01,取反是0xFE,再加1是0xFF,这才是整数-1的表示
0x01+0xFF,最高位溢出舍弃了,得到的结果是0
[解决办法]
- Assembly code
; a = -128;00414135 mov byte ptr [a],80h ; a = -a;0041415E movsx eax,byte ptr [a] ;eax = 0xFFFFFF80 = -12800414162 neg eax ;eax = 0x00000080 = 12800414164 mov byte ptr [a],al ;a = 0x80;; int k = -128;00414204 mov dword ptr [k],0FFFFFF80h ; k = -k;0041420B mov eax,dword ptr [k] 0041420E neg eax 00414210 mov dword ptr [k],eax