C - unsigned int 变负 (-ve)

C - unsigned int going negative (-ve)

我所知道的是 - UNSIGNED INT 不能取负值。
如果我取 UNSIGNED INTmaximum value 并递增它,我应该得到 ZEROminimum value 如果我取 minimum value 并递减它,我应该得到 maximum value
那么,为什么会这样呢?

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int main()
{
    unsigned int ui;
    ui = UINT_MAX;
    ui ++;
    printf("ui = %d", ui);

    ui = 0;
    ui --;
    printf("\n");
    printf("ui = %d", ui);

    return EXIT_SUCCESS;
}

输出:

ui = 0
ui = -1

您将值传递给省略号函数 (printf)。你不应该对这里的签名抱有任何期望。

格式字符串中的%d控制显示值的符号。由于您选择了 %d,因此 printf 函数中有一个转换。这就是为什么您会看到 signed 值等于二进制值 FFFFFFFF1.

1 假设整数为 32 位宽度。

来自'man 3 printf':

d, i The int argument is converted to signed decimal notation

因此,虽然 ui 的类型是 unsigned int,但 printf 将其解释为 signed int 并如此显示。

那是因为您使用 %d 格式说明符 printf 将您的数字视为有符号整数。 尝试使用 %u 输出无符号值,你会得到想要的结果。

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int main()
{
    unsigned int ui;
    ui = UINT_MAX;
    ui ++;
    printf("ui = %u", ui);
    ui = 0;
    ui --;
    printf("\n");
    printf("ui = %u", ui);
    return EXIT_SUCCESS;
}

输出:

ui = 0
ui = 4294967295

查看 reference 可能的格式说明符。

printf("%u") 应该用于 unsigned ints。