|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
}
请问一下我是哪里写错了吗?求大佬帮忙
你的代码有一个问题,导致结果不符合预期。问题出在以下这行代码:
这行代码的目的是检查变量 i 的最高位是否为1,以判断是否发生了高位溢出。但是,由于 x 的值是 1 << (sizeof(int) * 8 - 1) ,这个值实际上是一个负数,而不是正数1。
在C语言中,右移操作对于有符号整数会进行符号扩展,即最高位的符号位会被复制到左边的空位上。因此,如果 i 的最高位是1,右移后的结果会一直是负数。而如果 i 的最高位是0,右移后的结果会一直是0。
因此,你需要修改代码来正确判断高位溢出的情况。你可以使用以下代码来实现:
- int result = i & (1 << (sizeof(int) * 8 - 1));
复制代码
这样, result 的值就是 i 的最高位的值了。然后,你可以根据 result 的值来输出相应的结果。
另外,你在 printf 函数中使用了 i<<=1 和 i>>=1 来同时进行左移和右移操作,并且希望输出结果。然而,这样的写法是不正确的,因为 i<<=1 和 i>>=1 是赋值操作,会改变 i 的值,并且返回的值是赋值后的结果,而不是进行左移和右移操作的结果。
如果你想同时进行左移和右移操作,并输出结果,你可以使用以下代码来实现:
- int left_shift_result = i << 1;
- int right_shift_result = i >> 1;
- printf("左移和右移的值分别为:%d %d", left_shift_result, right_shift_result);
复制代码
这样,你就可以正确地输出左移和右移的结果了。
希望对你有帮助!如果还有其他问题,请随时提问。
|
|