【问题标题】:C : Modulus operator on unsigned int gives unexpected outputC:无符号整数上的模运算符给出了意外的输出
【发布时间】:2013-04-13 21:14:54
【问题描述】:
#include <stdio.h>

main() {
    unsigned a = -20;
    unsigned b = 10;
    printf("%d\n", (a % b));
    printf("%d\n", (-20 % 10));
}

Output:
6
0

第二个 printf 打印期望值 0,而第一个 printf 打印 6。 为什么这个带有无符号整数的意外输出?

【问题讨论】:

  • 因为 1&lt;&lt;32 不能被 10 整除?顺便说一句:为什么你对 unsigned int 使用负初始化器? BTW2: printf() 具有用于无符号整数的 %u 说明符。 %d 用于有符号整数。

标签: c unsigned modulus unsigned-integer


【解决方案1】:

你期待什么?

a % b 等价于,让我们替换这些值并将一元 - 应用于 20 的无符号 int 值 (UINT_MAX-20+1) % 10 并且结果的类型是 unsigned int 并且您正在使用 @ 打印它987654325@,这是错误的。你应该在这里使用%u

【讨论】:

    【解决方案2】:

    unsigned int 可以保存从 0 到 UINT_MAX 的值,没有负值。所以-20 被转换为-20 + UINT_MAX + 1

    在您的系统上:

    (-20 + UINT_MAX + 1) % 10 != -20 % 10
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-08
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 2016-03-11
      • 2012-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多