【问题标题】:How it is possible to turn unsigned int to negative number with bit shift?如何通过位移将 unsigned int 转换为负数?
【发布时间】:2016-11-29 16:02:58
【问题描述】:

为什么我在执行时得到负数?

unsigned int a = 1 << 31;
printf("%d",a);

我已经在我的计算机上检查了整数的大小,它是 4 字节。所以我的整数由 32 位组成,向左移动 31 次,我应该得到最高有效位。这意味着它应该是正数,但我总是得到负数。

我得到了什么:-2147483648

我的预期:一些正数(可能是 1073741824)

我在这里缺少什么?

【问题讨论】:

  • 您打印的是签名!
  • printf("%u",a); 应该修复它。

标签: c bitwise-operators


【解决方案1】:

问题不在于您正在移位。您根本没有以相应的格式打印。

%d 或 %i 用于打印 int,因此当您尝试打印 unsigned int 时,它会转换为有符号 int。

请看这里:What is the format specifier for unsigned short int?

https://www.le.ac.uk/users/rjm1/cotter/page_30.htm

【讨论】:

    【解决方案2】:

    使用 %u 作为 printf 格式字符串。

    意思:

    printf("%u",a);
    

    【讨论】:

      【解决方案3】:

      除了您使用了错误的格式说明符(%d 而不是 %u)之外,您还可能通过将 1 移入 int 操作数的符号位来调用未定义的行为,如中所述this answer.
      要修复它,请使用无符号文字:

      unsigned int a = 1u << 31;
      //                ^
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-15
        相关资源
        最近更新 更多