C - unsigned int为负数(-ve)

时间:2015-03-05 05:57:02

标签: c unsigned-integer

我所知道的是 - UNSIGNED INT不能承担负值 如果我取maximum value的{​​{1}}并递增它,我应该得到UNSIGNED INT,即ZERO,如果我取minimum 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;
}

4 个答案:

答案 0 :(得分:3)

来自&#39; man 3 printf&#39;:

  

d,i int参数转换为带符号的十进制表示法

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

答案 1 :(得分:2)

这是因为您使用%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可能的格式说明符。

答案 2 :(得分:2)

printf("%u")应该用于unsigned int

答案 3 :(得分:1)

您将值传递给省略号函数(printf)。你不应该对这里的签名一无所知。

格式字符串中的%d控制显示值的符号。自您选择printf以来,%d函数中存在一个强制转换。这就是为什么你看到一个signed值等于二进制值FFFFFFFF 1

1 假设整数为32位宽。