读书人

一不小心钻了牛角尖 CHAR 类型相反

发布时间: 2012-04-07 17:31:52 作者: rapoo

一不小心钻了牛角尖 ,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 

读书人网 >C++

热点推荐