13

変数を含む .cpp ファイルを読み込んでいますunsigned char。ビット単位の左シフト 16 ビットを試しています。16 ビットunsigned charは 8 ビットで構成されているため、左シフト 16 ビットはすべてのビットを消去し、8 つの 0 で埋めます。

unsigned char byte=0xff; byte << 16;

4

2 に答える 2

18

値をシフトすると、

unsigned char x = ...;
int y = x << 16;

のタイプは、適合する場合(ほとんどのシステム)、または適合しない場合(まれに1x )に昇格されます。25 ビット幅以上である限り、データは破棄されません2intunsigned charintunsignedunsigned charintint

16これはtypeを持つという事実とはまったく関係がないことに注意してくださいint

/* All three are exactly equivalent */
x << 16;
x << 16u;
x << (unsigned char) 16;

出典: n1516 (C99 ドラフト) から:

§6.5.7 パラグラフ 3: ビット単位のシフト演算子

整数昇格は各オペランドで実行されます。結果の型は、昇格された左オペランドの型です。

§6.3.1.1 パラグラフ 2: ブール値、文字、および整数

int が元の型のすべての値を表すことができる場合 (ビットフィールドの幅によって制限されるため)、値は int に変換されます。それ以外の場合は、unsigned int に変換されます。これらは整数プロモーションと呼ばれます。

脚注:

1 : 一部の DSP チップと特定の Cray スーパーコンピューターには、sizeof(char) == sizeof(int). これにより、追加のメモリ消費を犠牲にして、プロセッサのロード/ストア ユニットの設計が簡素化されます。

2 : 左シフトが に昇格されintてからオーバーフローしたint場合、これは未定義の動作です (悪魔が鼻から飛び出す可能性があります)。比較すると、オーバーフローunsignedは常に明確に定義されているため、通常は型に対してビット シフトを行う必要unsignedがあります。

于 2012-05-25T04:43:06.373 に答える
1

charの中に収まる場合int、 に昇格され、int期待どおりの結果が得られます。そうでない場合は、標準に従って未定義の動作であり、おそらくコンパイル警告が発行されます。標準から:

The integer promotions are performed on each of the operands. The type of the result is that of the promoted left operand. If the value of the right operand is negative or is greater than or equal to the width of the promoted left operand, the behavior is undefined.

于 2012-05-25T04:36:09.587 に答える