Dffg_ 2023-04-14 23:17 采纳率: 25%
浏览 22
已结题

c语言中关于int型变量以及INT_MIN的问题

我创建了一个int型变量my_int_min,并对他赋值为INT_MIN,可以得到:

my_int_min=-my_int_min=INT_MIN=-INT_MIN=-2147483648

所以,我预测表达式 !(-my_int_min&INT_MIN)的值应该为0,但实际运算结果为1,更加让我不理解的是表达式 !(-my_int_min&my_int_min) 的值为0。这是为什么呢?

代码如下:

 #include <limits.h>
 int my_int_min = INT_MIN;
 printf("INT_MIN=%d\t my_int_min=%d\t -INT_MIN=%d\t -my_int_min=%d\n", INT_MIN, my_int_min, -INT_MIN, -my_int_min);
 printf("!(-INT_MIN&INT_MIN)=%d\t !(-my_int_min&INT_MIN)=%d\n", !(-INT_MIN&INT_MIN), !(-my_int_min&INT_MIN));
 printf("!(-INT_MIN&my_int_min)=%d\t !(-my_int_min&my_int_min)=%d\n", !(-INT_MIN&my_int_min), !(-my_int_min&my_int_min));

运行结果截图:

img

又进行了测试:

printf("(-my_int_min&INT_MIN)=%d\t !(-my_int_min&INT_MIN)=%d\n", (-my_int_min&INT_MIN), !(-my_int_min&INT_MIN));

运行结果:

img


为什么逻辑非会出错呢?

  • 写回答

2条回答 默认 最新

  • Gary_HanJR 2023-04-14 23:30
    关注

    这个问题的本质在于 -INT_MIN 和 INT_MIN 在二进制补码中的表示方式不同,其中 -INT_MIN 在二进制补码中的表示方式有可能与 INT_MIN 相同也有可能不同,取决于 INT_MIN 转换成二进制补码时的情况。
    以 4 位二进制补码为例,假设 INT_MIN 等于 -8,即二进制补码为 1000,而 -INT_MIN 由正数取反加 1 得到,即 0111+1=1000,仍然等于 8。因此,在这种情况下,my_int_min=-my_int_min=INT_MIN=-INT_MIN=-8,!(-my_int_min&INT_MIN) 的结果为0。
    而如果 INT_MIN 等于 -16,即二进制补码为 10000,而 -INT_MIN 的二进制补码为 10000,仍然等于 -16。因此,在这种情况下,my_int_min=-my_int_min=INT_MIN=-INT_MIN=-16,!(-my_int_min&INT_MIN) 的结果为1。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月21日
  • 修改了问题 4月15日
  • 修改了问题 4月14日
  • 创建了问题 4月14日

悬赏问题

  • ¥15 Tradingview两个副图指标叠加后。在不同的时间框架,和不同的产品,数值参数差异。导致可视化效果
  • ¥15 用js遍历数据并对非空元素添加css样式
  • ¥15 使用autodl云训练,希望有直接运行的代码(关键词-数据集)
  • ¥50 python写segy数据出错
  • ¥20 关于线性结构的问题:希望能从头到尾完整地帮我改一下,困扰我很久了
  • ¥30 3D多模态医疗数据集-视觉问答
  • ¥20 设计一个二极管稳压值检测电路
  • ¥15 内网办公电脑进行向日葵
  • ¥15 如何输入双曲线的参数a然后画出双曲线?我输入处理函数加上后就没有用了,不知道怎么回事去掉后双曲线可以画出来
  • ¥50 WPF Lidgren.Network.Core2连接问题