可能的重复:
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(使用前将#替换为@)