我正在使用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来运行我的程序,如果它有用的话。
答案 0 :(得分:5)
在Borland C编译器上,int的大小是16位。声明
h = (h<<8)+(h<<6);
overflows a signed integer。各个移位操作都很好,因为结果在16位有符号整数可以容纳的范围内。但是添加会导致溢出。 C中的有符号整数溢出为undefined behaviour。
答案 1 :(得分:1)
似乎在运行程序的环境中,类型int
的宽度为2个字节,其最大值为+32767
。
因此,当正值超出此限制时,可以设置符号位并获得负值。
您可以通过以下方式检查可以存储在int类型的对象中的最大值:
#include <stdio.h>
#include <limits.h>
int main( void )
{
printf( "The maximum is %d\n", INT_MAX );
}
您可以使用类型unsigned int
或键入long
或unsigned long
例如,编译器提供的类型unsigned int
的最大值可以等于65535
。存储表达式的结果就足够了。