1

私は次のコードを持っています

char x ='s', y='e';

if((x+(y<<16)) == ('a'+('b'<<16)))
    //do something

 switch (x+(y<<16)) {
    case 'a'+('b'<<16):
        //do something
        break;

ifとで行われた比較でキャストの問題はありswitchますか?

4

4 に答える 4

2

2番目の値を16ビットビットシフトしてから、最初の値を追加するのはあなたの意図ですか?もしそうなら、あなたは問題を抱えることになるでしょう、なぜなら+それはより高い優先順位を持っているからです<<

次の2つの式は、これを示しています。

'a' + 'c' << 16
'b' + 'b' << 16

評価は私たちに与えます:

printf("%X : %X\n", 'a' + 'c' << 16, 'b' + 'b' << 16);

結果は次のとおりです。

C40000 : C40000

これは、'a''c'が両方ともにプロモートされint、加算が行われ、16ビットが左シフトされるためです。同様に'b''b'。なので('a' + 'c') == ('b' + 'b')、結果は同じです。

代わりにこれを意図した(または想定した)場合:

'a' + ('c' << 16)
'b' + ('b' << 16)

printf("%X : %X\n", 'a' + ('c'<<16), 'b' + ('b'<<16));

結果は次のとおりです。

630061 : 620062

私はあなたが到達しようとしているものだと思います。そうでない場合、そしてあなたが現在の評価の優先順位に依存しているなら、あなたはおそらくあなたが持っているもので大丈夫です。

質問内容の変更のために更新された編集:

それ自体はキャストの問題はないはずです。すべての値はint、現在記述されている評価のためにコンパイラーによってプロモートされます。結果を問題が発生するよりも小さいものに割り当てることを計画している場合intshortそれがあなたのシフト深度であるため、16ビットでさえ十分に広くはありません。適切な評価を行うには、少なくとも24ビットのスペースが必要です。実装でintは、中途半端な組み込みシステムを使用していない限り、それが許可される可能性があります(見知らぬものを見たことがあります)。

于 2013-01-04T18:00:09.327 に答える
1

演算子の優先順位の問題を回避するために、いくつかの括弧を挿入することをお勧めします。

#define MYMACRO(X,Y) ((X)+(Y)<<16)

そうしないと、予期しないことが発生する可能性があります。

switch(MYMACRO(a+1,b+1)) // expands into switch(a+1+b+1<<16)
于 2013-01-04T17:22:20.230 に答える
0

キャストの問題はありません。

コンパイラはx+yをintにプロモートし、16だけ左にシフトしてから、整数比較を実行します。

読みやすくするために、unsigned int比較が必要な場合は、次のようにコーディングできます。

`if((  (unsigned)(x+y)<<16u) == ( (unsigned)('a'+'b')<<16u))  `
于 2013-01-04T18:05:31.240 に答える
0

このように拡張するとどうなるか見てみましょう

MYMACRO(1<<2, 2<<3)+1

それで

define MYMACRO(X,Y) X+Y<<16

する必要があります

define MYMACRO(X,Y) ((X)+(Y)<<16)
于 2013-01-04T17:25:18.383 に答える