2012-01-08 7 views
0

コードを実行すると、私はy=-124z=4294967172 を得ることができますか? (x<128あればどんな問題がイマイチというテスト)文字変数が間違っている

char x=132; 
signed y=x; 
unsigned z=x; 
cout<<y<<endl; 
cout<<z<<endl; 
+2

@ iammilind:それは完全に間違っています。 'x'の後に無名のパディングバイトがあっても、プログラムの意味には決して影響しません。 –

答えて

3

charあなたがchar x = 132を書くときに、あなたが実際にこれを行う、8ビットでありますシステムは符号拡張を使用します。つまり、符号ビットをすべてのビットにコピーします。だから、値が次のようになります。

1111 1111 1111 1111 1111 1111 1000 0100 

あなたは符号付きの値としてそれを解釈した場合、それは-124だし、あなたが最初の行にunsignedようcharを定義した場合、符号なし値として、それは、また4294967172.

です符号拡張が符号なしの値に対して行われないため、常に132になります。

+0

うわー、ありがとう、非常に興味深いことに、私はここに来ました。また、ジェームスマクネリスのおかげで答えを完了し、これを解決する方法を教えてくれました – Arash

2

charのは、彼らが唯一の半分の値であることを意味する、あなたがsigned char型を使用している0を含む256の値を保持することができることを意味している、唯一の8ビットです

+0

ありがとう、しかし、zの値はどうですか?符号なしだが表示されない132 – Arash

+1

xの値から符号なし32ビット整数の最大値を差し引いた値になります。 – Rabbit

1

最初の行xが10000100(132は10000100b)の後、マシンの-124の値です(hereを参照)。
したがって、2行目の後yは-124です。
そして3行目の後zは111 ... 1110000100bです。負の数を設定しているため上位ビットに1がありますが、コンパイラのプリント時にzが符号なしなのでバイナリ値が出力されます。

x = 1000 0100 

signed intunsigned int、32ビットであり、そしてあなたに「小さい」変数の値を割り当てるたび:

関連する問題