C - unsigned int 变负 (-ve)
C - unsigned int going negative (-ve)
我所知道的是 - UNSIGNED INT
不能取负值。
如果我取 UNSIGNED INT
的 maximum value
并递增它,我应该得到 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;
}
输出:
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 int
s。
我所知道的是 - UNSIGNED INT
不能取负值。
如果我取 UNSIGNED INT
的 maximum value
并递增它,我应该得到 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;
}
输出:
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 int
s。