如果问题看起来很奇怪,我道歉。我正在调试我的代码,这似乎是问题,但我不确定。
谢谢!
这取决于你想要的行为。 int
不能保持unsigned int
可以拥有的许多价值。
你可以照常投射:
int signedInt = (int) myUnsigned;
但如果unsigned
值超过int
可以容纳的最大值,这将导致问题。这意味着一半可能的unsigned
值将导致错误行为,除非您特别注意它。
如果你没有充分的理由进行转换,你应该重新审视如何存储值。
编辑:正如ProdigySim在评论中所提到的,最大值取决于平台。但你可以使用INT_MAX
和UINT_MAX
访问它。
对于通常的4字节类型:
4 bytes = (4*8) bits = 32 bits
如果使用全部32位,如unsigned
,则最大值将为2 ^ 32 - 1,或4,294,967,295
。
签名的int
有效地为符号牺牲了一位,因此最大值将是2 ^ 31 - 1,或2,147,483,647
。请注意,这是另一个值的一半。
unsigned int可以通过简单表达式转换为signed(或反之亦然),如下所示:
unsigned int z;
int y=5;
z= (unsigned int)y;
虽然没有针对这个问题,但您想阅读以下链接:
如果你有一个变量unsigned int x;
,你可以使用int
将其转换为(int)x
。
这很简单:
unsigned int foo;
int bar = 10;
foo = (unsigned int)bar;
或相反亦然...
一些解释来自C ++ Primer 5th Page 35
如果我们为无符号类型的对象分配超出范围的值,则结果是值的剩余部分以目标类型可以容纳的值的数量为模。
例如,8位无符号字符可以保存0到255之间的值,包括0和255。如果我们指定一个超出范围的值,编译器会将该值的余数分配给模256。
unsigned char c = -1; // assuming 8-bit chars, c has value 255
如果我们将一个超出范围的值分配给有符号类型的对象,则结果是未定义的。该程序似乎可以工作,可能会崩溃,或者它可能会产生垃圾值。
页面160:如果任何操作数是无符号类型,操作数转换的类型取决于机器上的整数类型的相对大小。
...当符号性不同且无符号操作数的类型等于或大于带符号操作数的类型时,带符号的操作数将转换为无符号。
其余情况是签名操作数的类型大于无符号操作数的类型。在这种情况下,结果取决于机器。如果无符号类型中的所有值都适合大类型,则无符号操作数将转换为有符号类型。如果值不适合,则将带符号的操作数转换为无符号类型。
例如,如果操作数是long和unsigned int,并且int和long具有相同的大小,则长度将转换为unsigned int。如果long类型有更多位,则unsigned int将转换为long。
我发现阅读这本书非常有帮助。
如果在同一表达式中使用unsigned int和(signed)int,则signed int会隐式转换为unsigned。这是C语言的一个相当危险的特性,因此您需要注意这一点。它可能是也可能不是你的bug的原因。如果您想要更详细的答案,则必须发布一些代码。