首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一不小心钻了牛角尖 ,CHAR 类型相反数的有关问题

2012-04-07 
一不小心钻了牛角尖,CHAR 类型相反数的问题int main(){char c 0cout(int)cendlc -ccout(int)

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

热点排行