|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <stdio.h>
void yichu(int i)
{
int x = 1 << (sizeof(int) * 8 - 1);
int result = x & i;
if (result == 1)
printf("发生了高位溢出\n");
else
printf("左移和右移的值分别为:%d %d",i<<=1,i>>=1);
}
int main(void)
{
int i;
printf("请输入一个数:"); scanf("%d",&i);
yichu(i);
return 0;
}
求大佬指点为什么输入1000000000000明显溢出的值,却不会打印发生了高位溢出?
问题出在这一行代码上:
在这里,你使用了位运算符 & 来检查最高位是否为1,以判断是否发生了高位溢出。然而,这个判断是错误的。
1 << (sizeof(int) * 8 - 1) 会将1左移到整型变量的最高位,得到一个负数。在大多数机器上, int 类型是32位的,所以左移31位后的值为-2147483648。而你输入的1000000000000明显比这个值要大,所以最高位肯定是1,但是由于 int 类型的范围限制,它的值会被截断,导致判断结果为0,即没有发生高位溢出。
要正确判断高位溢出,你可以使用无符号整型来存储输入的值,并将判断条件修改为:
- unsigned int x = 1 << (sizeof(unsigned int) * 8 - 1);
- unsigned int result = x & i;
- if (result != 0)
- printf("发生了高位溢出\n");
- else
- printf("左移和右移的值分别为:%u %u", i <<= 1, i >>= 1);
复制代码
这样,就能正确判断高位溢出了。
|
|