左移一个正整数给我一个负数

时间:2015-12-09 23:09:16

标签: c

我正在使用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来运行我的程序,如果它有用的话。

2 个答案:

答案 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或键入longunsigned long

来代替int类型

例如,编译器提供的类型unsigned int的最大值可以等于65535。存储表达式的结果就足够了。