当我将负值赋给 unsigned int 时会发生什么? [复制]

2024-01-20

可能的重复:
C 中的有符号到无符号转换 - 它总是安全的吗? https://stackoverflow.com/questions/50605/signed-to-unsigned-conversion-in-c-is-it-always-safe

假设我声明了一个 unsigned int 类型的变量:unsigned int x = -1;

现在 -1 的二进制补码(假设 32 位机器)是 0xFFFFFFFF。 现在,当我将此值赋给 x 时,值 0x7FFFFFFF 是否被赋给了 x?

如果是这样,则 printf("%d",x);会打印 0x7FFFFFFF 的十进制等值,对吗?但是,显然这并没有发生,因为打印的值为 -1。我在这里缺少什么?

编辑:我知道我们可以使用 %u 格式说明符来打印无符号值。 但这无助于回答上面的问题。


The "%d"格式适用于(有符号)int 值。如果将其与无符号值一起使用,它可能会打印实际值以外的内容。使用"%u"查看实际值,或%x以十六进制查看它。

在声明中

unsigned int x = -1;

表达方式-1类型为 int,值为 -1。初始化器将此值从 int 转换为 unsigned int。有符号到无符号转换的规则表示该值按模减少UINT_MAX + 1, so -1将转换为UINT_MAX(这可能是0xffffffff or 4294967295 if unsigned int是 32 位)。

你只需cannot将负值赋给无符号类型的对象。任何此类值在分配之前都会被转换为无符号类型,并且结果将始终 >= 0。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我将负值赋给 unsigned int 时会发生什么? [复制] 的相关文章

随机推荐