如果我的问题看起来有些奇怪,那我向你道歉。我正在调试我的代码,这似乎是问题所在,但我不确定。
谢谢!
如果我的问题看起来有些奇怪,那我向你道歉。我正在调试我的代码,这似乎是问题所在,但我不确定。
谢谢!
这取决于您想要的行为是什么。一个 int
无法容纳许多 unsigned int
可以容纳的值。
您可以像平常一样进行强制类型转换:
int signedInt = (int) myUnsigned;
如果unsigned
的值超过了int
所能容纳的最大值,这会导致问题。这意味着有一半可能的unsigned
值会导致错误行为,除非你特别注意它。
如果你不得不进行转换却没有好的理由,那么你应该重新审视一下如何存储值。
编辑:如评论中所述,最大值取决于平台。但是你可以通过使用 INT_MAX
和 UINT_MAX
来访问它。
对于通常的4字节类型:
4 bytes = (4*8) bits = 32 bits
如果使用了所有32位,如同使用unsigned
,最大值将是2^32 - 1或4,294,967,295
。int
为了表示正负数牺牲了1位,所以最大值为2^31 - 1或2,147,483,647
。注意这是另一个值的一半。<limits.h>
中)也是必需的。 - DevSolar在我看来,这个问题是一个常见的问题。正如各种答案中所述,将不在范围[0,INT_MAX]内的无符号值分配给变量是实现定义的,甚至可能会引发信号。如果将无符号值视为有符号数字的二进制补码表示,则可能最便携的方法是以下代码片段所示的方式:
#include <limits.h>
unsigned int u;
int i;
if (u <= (unsigned int)INT_MAX)
i = (int)u; /*(1)*/
else if (u >= (unsigned int)INT_MIN)
i = -(int)~u - 1; /*(2)*/
else
i = INT_MIN; /*(3)*/
第一条分支是显而易见的,不会引发任何溢出或陷阱,因为它保留了值。
第二条分支为避免有符号整数溢出而采取了一些措施,它通过按位非运算对值进行一次补码,将其转换为“int”(现在无法溢出),然后取反该值并减去1,这里也不会溢出。
第三条分支提供了我们必须接受的毒药,即针对补码或符号/大小目标的一次补码,因为有符号整数表示范围小于二进制补码表示范围。
这可能会归结为在二进制补码目标上的简单移动;至少我观察到GCC和CLANG也是这样。如果想将执行限制为二进制补码目标,则可以将代码压缩为:
#include <limits.h>
unsigned int u;
int i;
if (u <= (unsigned int)INT_MAX)
i = (int)u; /*(1)*/
else
i = -(int)~u - 1; /*(2)*/
(unsigned int)INT_MIN
是被良好定义的吗? - Dan Bechard无符号整型可以通过下面的简单表达式转换为有符号整型(反之亦然):
unsigned int z;
int y=5;
z= (unsigned int)y;
尽管与问题无关,您可能想阅读以下链接:
如果您有一个变量unsigned int x;
,您可以使用(int)x
将其转换为int
。
就是这么简单:
unsigned int foo;
int bar = 10;
foo = (unsigned int)bar;
或者反过来...
来自C++Primer第五版第35页的一些解释
如果我们将一个超出无符号类型对象范围的值赋给它,结果是该值模目标类型可以容纳的值的数量的余数。
例如,一个8位无符号字符可以容纳从0到255(包括)的值。如果我们分配一个超出此范围的值,则编译器会分配该值模256的余数。
unsigned char c = -1; // assuming 8-bit chars, c has value 255
如果我们将一个超出范围的值赋给有符号类型的对象,结果是未定义的。程序可能会正常工作,也可能会崩溃,或者产生垃圾值。
第160页: 如果任何操作数是无符号类型,则操作数转换的类型取决于机器上整数类型的相对大小。
... 当有符号性不同时,且无符号操作数的类型与有符号操作数的类型相同或更大时,有符号操作数将被转换为无符号操作数。
剩下的情况是有符号操作数比无符号操作数具有更大的类型。在这种情况下,结果取决于机器。如果无符号类型中的所有值都适合大型类型,则无符号操作数将被转换为有符号类型。如果值不适合,则有符号操作数将被转换为无符号类型。
例如,如果操作数是长整型和无符号整型,并且int和long具有相同的大小,则长度将被转换为无符号整型。如果long类型具有更多位,则无符号整型将被转换为long。
我发现阅读这本书非常有帮助。