void test()
{
unsigned char c;
c = (~0)>>1 ;
printf("c is %u\n",c);
}
255を出力します。右シフト後に左端のビットが0に設定されることを期待していたので、127を期待していました。これは、コンパイラが右回転を実行しているためですか?
void test()
{
unsigned char c;
c = (~0)>>1 ;
printf("c is %u\n",c);
}
255を出力します。右シフト後に左端のビットが0に設定されることを期待していたので、127を期待していました。これは、コンパイラが右回転を実行しているためですか?
リテラル0
はタイプint
です。したがって、式全体がタイプとして評価されますint.
表現:
(~0) >> 1
タイプとして評価されint
ます。
~0
評価しています。0xffffffff
0x7fffffff
。c
(is )に格納するunsigned char
と、whichisに切り捨てられ0xff
ます255
。
期待どおりの結果を得るには、 :127
をキャストする必要があります。~0
c = (unsigned char)(~0) >> 1;
補足:0
toだけをキャストしてもunsigned char
、結果は。になります255
。これは、暗黙の整数拡張によるものです。int
に昇格されるよりも小さいすべての中間体int
。
コンパイラは〜0をintとして扱い、次にシフトしてからunsignedcharに変換しています。このプログラムは、期待値を出力します。
void test()
{
unsigned char c;
c = ((unsigned char)(~0)) >> 1 ;
printf("c is %u\n",c);
}