c - C 中的无符号值

标签 c printf unsigned

我有以下代码:

#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/

相关文章:

C中的数组可以定义为根据用户的输入进行调整吗?

c - 将单个参数列表传递给两个 v*printf() 调用

c - 为什么我的代码只产生 0.000000 结果?

c - 在 C 中使用 wcslen 时出现段错误

assembly - GCC 在转换 unsigned int 时如何使用 fildll?

c - 行主序存储到多维数组

c - Linux;如果您不是 root,请将 UID 更改为 root

c++ - C/C++ : How to properly convert "unsigned int *" value to "unsigned int"?

在C中将无符号短数组转换为字节数组

C - 返回第一个非空白字符