2

OK、これは私が今まで見たことがない奇妙な問題です。

#include <iostream>
int main()
{
  char testchar = 255;
  std::cout << (unsigned int)testchar << std::endl;
}

出力:

4294967295

一体何?charが「full」であるため、新しいunsigned int型を生成すると、結果も「full」になるようです。これは私が覚えている、または私が期待している結果ではありません。unsignedintの値は0x000000FFであると思います。誰かが私にここで何が起こっているのかを正確に説明できますか?

システム:Ubuntu12.0464ビット

g ++バージョン:4.6.3

4

1 に答える 1

8

あなたcharは明らかに署名されています。これは、255がオーバーフローしていることを意味しcharます。明らかに2の補数マシンを使用しているため、255のビットパターンがに格納されていますchar(つまり、すべてのビットが設定されています)。符号付き8ビット数として解釈すると、-1になります。

次に、その値は32ビットに符号拡張されてint32 1ビットになります(ただし、同じ値-1)。最後に、その値はに変換されunsigned intます。2 32 -1を法とする還元によって行われる規則によれば、可能な限り最大の32ビット数(4294967295)が得られます。

于 2012-11-05T03:30:01.437 に答える