位是位。发生隐式转换。只要它们的大小相同,任何unsigned int都可以表示为signed int。当我第一次看到这个时,我感到很困惑(对于许多类型的编程来说这不是很常见),并且可能因编译器和编译器不同而不同,因此在依赖它之前对其进行测试。下面是一些演示它是如何工作使用字符,使之易于理解的代码:
#include <iostream>
int main()
{
unsigned int u = 0;
while (u != 256)
{
const signed char s = u; // putting an unsigned type (u) into a signed type (s)
// cast s up here so we don't print the extended ascii char.
std::cout << (signed int)s << " signed == " << u << " unsigned" << std::endl;
++u;
}
return 0;
}
这里有一个位从码输出:
-128 signed == 128 unsigned
-127 signed == 129 unsigned
-126 signed == 130 unsigned
...
-3 signed == 253 unsigned
-2 signed == 254 unsigned
-1 signed == 255 unsigned
C++ 11级的编译器会生成一个狭窄的错误如果初始化是这样的:
unsigned int j = {-32768}; // Notice the brackets
这不是非twos'补硬件真。 – 2012-03-14 19:12:07