質問

(char) 0xff を 8 だけ左シフトして int にキャストすると、-256 または 0xffffff00 が得られます。なぜこれが起こるのか誰か説明できますか?

#include <stdio.h>
int main (void)
{   
    char c = 0xff;
    printf("%d %x\n", (int)(c<<8),(int)(c<<8));
    return 0;
}

出力は

-256 ffffff00
役に立ちましたか?

解決

charは、符号付きまたは符号なしすることができます - それは実装定義です。 charは、コンパイラではデフォルトで署名されているので、あなたは、これらの結果を参照してください。

signed char型0xFFのためには、に対応-1(すなわち、どのように2の補数作品です)。あなたはそれをシフトしようとすると、それは最初intに昇格してからシフトしている - あなたは、効果的に256で乗算を取得

だから、このコードです。

char c = 0xFF; // -1
int shifted = c << 8; //-256 (-1 * 256)
printf( "%d, %x", shifted, shifted );

他のヒント

私が最初にこの問題を調べたとき、私の最初の見解は、char 'c' を 8 ビット左にシフトする必要があるということでした。8 ビットはすべて破棄され、空の char は値 0 の int にキャストされます。

少し調査すると明らかになります 通常の単項変換 - これは、多数の算術型を削減するための場所であり、変換は単項演算子の '!'、'-'、'~'、および '*' 演算子のオペランドに自動的に適用されます。 そして 二項演算子「<<」および「>>」の各オペランドに適用されます。

したがって、char 'c' は int に変換されます。 初め, 、次に左にシフトすると、表示されている答えが得られます。

毎日何か新しいことを学びます!

シフト操作が行われる前に

cがint型に推進されています。あなたの実装は、デフォルトで署名した文字を作ると仮定すると、これはあなたが、あなたの結果を与えるために左にシフトさは0xffffffffを、取得するつもりだ意味します。

あなたはunsigned char型にCを作る場合は、

、あなたが期待するものを手に入れる必要があります。

charが何もなく、signed char型ではありません。だから、文字C = 0xFFでは次のようになります-1。あなたは8ビットでシフトを-1去ったとき、あなたが-256を取得します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top