私は次のコードを持っています
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
ますか?
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
、現在記述されている評価のためにコンパイラーによってプロモートされます。結果を問題が発生するよりも小さいものに割り当てることを計画している場合int
。short
それがあなたのシフト深度であるため、16ビットでさえ十分に広くはありません。適切な評価を行うには、少なくとも24ビットのスペースが必要です。実装でint
は、中途半端な組み込みシステムを使用していない限り、それが許可される可能性があります(見知らぬものを見たことがあります)。
演算子の優先順位の問題を回避するために、いくつかの括弧を挿入することをお勧めします。
#define MYMACRO(X,Y) ((X)+(Y)<<16)
そうしないと、予期しないことが発生する可能性があります。
switch(MYMACRO(a+1,b+1)) // expands into switch(a+1+b+1<<16)
キャストの問題はありません。
コンパイラはx+yをintにプロモートし、16だけ左にシフトしてから、整数比較を実行します。
読みやすくするために、unsigned int比較が必要な場合は、次のようにコーディングできます。
`if(( (unsigned)(x+y)<<16u) == ( (unsigned)('a'+'b')<<16u)) `
このように拡張するとどうなるか見てみましょう
MYMACRO(1<<2, 2<<3)+1
それで
define MYMACRO(X,Y) X+Y<<16
する必要があります
define MYMACRO(X,Y) ((X)+(Y)<<16)