我使用shift来对我用C语言编写的程序中的一些数学进行优化:
int h; h = 104; h = (h<<8)+(h<<6); printf("offset: %d",h);
我得到这个结果:
offset: -32256
当我期待的是
(104* (2^8) ) + (104 * (2^6)) = 33280
任何人都可以解释为什么我得到负面结果,我该怎么做才能得到我期望的结果?
我使用BORLANDC编译器与DOSBOX运行我的程序,如果这是有用的.
在Borland C编译器上,int的大小是16位.所以声明
h = (h<<8)+(h<<6);
溢出有符号整数.各个移位操作都很好,因为结果在16位有符号整数可以容纳的范围内.但是添加会导致溢出.有符号整数溢出是C中未定义的行为.