我很惊讶地知道我无法通过强制转换将signed转换为unsigned int!
int i = -62;
unsigned int j = (unsigned int)i;
Run Code Online (Sandbox Code Playgroud)
我以为自从我开始使用演员表后我就已经知道了,但是我不能这样做!
Jam*_*lis 45
您可以将其转换int为unsigned int.转换有效且定义明确.
由于该值为负,UINT_MAX + 1因此将其添加到该值,以使该值为有效的无符号数量.(从技术上讲,它添加了2 N,其中N是用于表示无符号类型的位数.)
在这种情况下,由于int您的平台上的宽度为32位,因此从2 32中减去62 ,产生4,294,967,234.
puz*_*zle 36
编辑:正如在其他答案中已经注意到的那样,标准实际上保证" 结果值是与源整数一致的最小无符号整数(模2n,其中n是用于表示无符号类型的位数) ".因此,即使您的平台没有将签名的整数存储为两个补码,行为也是一样的.
显然你的有符号整数-62存储在你平台上的二进制补码(维基百科)中:
62作为用二进制写的32位整数
0000 0000 0000 0000 0000 0000 0011 1110
Run Code Online (Sandbox Code Playgroud)
要计算二进制补码(用于存储-62),首先反转所有位
1111 1111 1111 1111 1111 1111 1100 0001
Run Code Online (Sandbox Code Playgroud)
然后加一个
1111 1111 1111 1111 1111 1111 1100 0010
Run Code Online (Sandbox Code Playgroud)
如果你把它解释为一个无符号的32位整数(就像你的计算机将你做的那样),你最终会得到4294967234 :-)
此转换定义明确,将产生值UINT_MAX - 61。在unsigned int32 位类型的平台上(当今最常见的平台),这正是其他人报告的值。然而,其他值也是可能的。
标准中的实际语言是
如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模 2^n,其中 n 是用于表示无符号类型的位数)。
我=-62 。如果你想将其转换为无符号表示。对于 32 位整数来说,它是 4294967234。一个简单的方法是
num=-62
unsigned int n;
n = num
cout<<n;
Run Code Online (Sandbox Code Playgroud)
4294967234