2
void test()
{

    unsigned char c;
    c = (~0)>>1 ;  
    printf("c is %u\n",c); 

}

255を出力します。右シフト後に左端のビットが0に設定されることを期待していたので、127を期待していました。これは、コンパイラが右回転を実行しているためですか?

4

2 に答える 2

8

リテラル0はタイプintです。したがって、式全体がタイプとして評価されますint.

表現:

(~0) >> 1

タイプとして評価されintます。

  • したがって、 (32ビットを想定して)~0評価しています。0xffffffff
  • シフト後は次のようになります0x7fffffff

c(is )に格納するunsigned charと、whichisに切り捨てられ0xffます255

期待どおりの結果を得るには、 :127をキャストする必要があります。~0

c = (unsigned char)(~0) >> 1;

補足:0 toだけをキャストしてもunsigned char、結果は。になります255。これは、暗黙の整数拡張によるものです。intに昇格されるよりも小さいすべての中間体int

詳細:https ://www.securecoding.cert.org/confluence/display/seccode/INT02-C.+Understand+integer+conversion+rules

于 2012-06-12T02:04:03.997 に答える
4

コンパイラは〜0をintとして扱い、次にシフトしてからunsignedcharに変換しています。このプログラムは、期待値を出力します。

void test()
{
    unsigned char c;
    c = ((unsigned char)(~0)) >> 1 ;  
    printf("c is %u\n",c); 
}
于 2012-06-12T02:03:52.217 に答える