我有以下代码:
#include <stdio.h>
int main() {
unsigned int a = -1;
int b = -1;
printf("%x\n", a);
printf("%x\n", b);
printf("%d\n", a);
printf("%d\n", b);
printf("%u\n", a);
printf("%u\n", b);
return 0;
}
输出是:
ffffffff
ffffffff
-1
-1
4294967295
4294967295
我可以看到根据传递给 printf
函数的值将值解释为有符号或无符号。在这两种情况下,字节都是相同的 (ffffffff
)。那么,unsigned
字是做什么用的?
最佳答案
将 int -1
分配给 unsigned
:因为 -1
不在 [0... UINT_MAX]
,添加 UINT_MAX+1
的倍数,直到答案在范围内。显然 UINT_MAX
在 OP 的机器上是 pow(2,32)-1 或 429496725
所以 a
的值为4294967295。
unsigned int a = -1;
"%x"
、"%u"
说明符需要一个匹配的unsigned
。由于这些不匹配,“如果转换规范无效,则行为未定义。
如果任何参数不是相应转换规范的正确类型,则行为未定义。”C11 §7.21.6.1 9. printf 说明符不更改b
。
printf("%x\n", b); // UB
printf("%u\n", b); // UB
"%d"
说明符需要匹配的 int
。由于这些不匹配,更多 UB。
printf("%d\n", a); // UB
给定未定义的行为,不支持结论。
both cases, the bytes are the same (ffffffff).
即使具有相同的位模式,不同的类型也可能具有不同的值。 ffffffff
作为 unsigned
的值为 4294967295。作为 int
,根据有符号整数编码,它的值为 -1、-2147483647或待定。作为 float
,它可能是 NAN .
what is unsigned word for?
unsigned
存储 [0 ... UINT_MAX]
范围内的整数。它永远不会有负值。如果代码需要非负数,请使用 unsigned
。如果代码需要一个可以是 +、- 或 0 的计数,请使用 int
。
更新:为了避免将带符号的 int
分配给 unsigned
时出现编译器警告,请使用以下代码。这是一个被取反的 unsigned
1u
- 上面的定义很好。效果与 -1
相同,但向编译器传达了直接意图。
unsigned int a = -1u;
关于c - C 中的无符号值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32344810/