我所知道的是 - 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;
}
答案 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位宽。