问题: C语言程序在32位机器上运行。程序中定义了三个变量X、Y、Z,其中X和Z是int型,Y为short型。当X=127,Y=-9时,执行赋值语句Z=X+Y后,X、Y、Z的值分别是多少?(十六进制数表示)
首先,计算机采用补码计算。 按照正常的思路是这样的: 很遗憾,这样是错误的! 下面解释原因(困惑了我好几个月) 先说答案:Z = 00000076H
为什么会是这样?我的第一反应是答案错了。事实真是如此吗? 我试着输出一下127的二进制:
int x = 127;
for(int i=31;i>=0;i--) cout << ((x>>i)&1);
cout << endl;
结果是这样:
再输出一下-9的补码的二进制:
short y = -9;
for(int i=15;i>=0;i--) cout << ((y>>i)&1);
cout << endl;
结果是这样:
也没毛病。
当我将-9当作int类型输出32位二进制位的时候,我发现了问题。
short y = -9;
for(int i=31;i>=0;i--) cout << ((y>>i)&1);
cout << endl;
结果是这样:
似乎高位多了很多1。 我恍然大悟:原来发生了隐式转换。(int)+ (short) = (int) + (short) 这种隐式转换小范围转换为大范围后,不会发生数值错误。 即相加的过程应该将Y也当作int类型参与计算。
计算过程应该是这样的:
(***,谁会想到这种东西做这个的时候会发生隐式转换啊) 自此,问题得到了很好的解决。(要想弄懂底层不是一件容易的事情啊,要会融会贯通)
|