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評価しています。0xffffffff0x7fffffff。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);
}