我很惊讶地发现,通过强制转换无法将带符号的整数转换为无符号整数!
int i = -62;
unsigned int j = (unsigned int)i;
我以为我已经知道了这一点,因为我开始使用类型转换了,但我做不到!
我很惊讶地发现,通过强制转换无法将带符号的整数转换为无符号整数!
int i = -62;
unsigned int j = (unsigned int)i;
我以为我已经知道了这一点,因为我开始使用类型转换了,但我做不到!
你可以将int
转换为unsigned int
。这种转换是有效的和明确定义的。
由于值是负数,因此会向其添加UINT_MAX + 1
,使该值成为有效的无符号数量(在技术上,将2N添加到其中,其中N是用于表示无符号类型的位数)。
在这种情况下,由于您的平台上int
的宽度为32位,所以62被从232中减去,得到4,294,967,234。
显然,您的有符号整数-62在您的平台上以二进制补码形式存储(维基百科):
32位二进制整数62的表示形式为:
0000 0000 0000 0000 0000 0000 0011 1110
为了计算二进制补码(以存储-62),首先需要翻转所有比特位。
1111 1111 1111 1111 1111 1111 1100 0001
然后加一
1111 1111 1111 1111 1111 1111 1100 0010
如果你把这个数解释为一个无符号32位整数(当你进行强制转换时,你的计算机会这样做),你最终将得到4294967234 :-)
UINT_MAX - 61
。在一个unsigned int
为32位类型的平台上(现今大多数常见平台),这恰好是其他人报告的值。然而,可能会出现其他值。如果目标类型是无符号的, 则结果值是源整数对2^n取模后最小的 无符号整数。
i=-62 . 如果你想将它转换成无符号表示法,那么对于32位整数,它将是4294967234。一个简单的方法是
num=-62
unsigned int n;
n = num
cout<<n;
4294967234
既然我们知道i
是一个int
,你可以直接对其进行无符号操作!
这样就可以解决问题了:
int i = -62;
unsigned int j = unsigned(i);
借助一些数学知识
#include <math.h>
int main(){
int a = -1;
unsigned int b;
b = abs(a);
}
从c++17起,可以使用make_unsigned_t
auto uint_variable = std::make_unsigned_t<int>(-62); //4294967234
unsigned int j = i;
来达到完全相同的效果。 - AnT stands with Russia(unsigned int)i
。应该使用static_cast<unsigned int>(i)
。请参见https://dev59.com/n3VD5IYBdhLWcg3wDXJ3#103868以了解详细信息。 - Holger Böhnke