8

Valフォームにパックされた int (32) 値があります

----------------------------------------
| 32-XXXXXXXXX-16 | 15-short-int-val-0 |
----------------------------------------

Val操作を行う場合、これから短い整数値を抽出する場合

short temp = Val & 0x0000FFFF;

操作の戻り値の型は何Val & 0x0000FFFFですか? (short)(Val & 0x0000FFFFF)に正しいデータを格納するには、値を型キャストする必要がありtempますか?

16進数は本質的に符号なし整数として扱われると想定しているため、疑問が生じます。

上記の操作は実行とどう違うのですか

short temp = Val & 0xFFFF;
4

3 に答える 3

1

32-bit int16-bit shortおよび と仮定しましょう8-bit char

short temp = Val & 0x0000FFFF;

Valタイプintです。これはis の型0x0000FFFFと同じです。0xFFFFint

Val & 0x0000FFFFも型になり、オブジェクトの初期化時にint暗黙的に変換されます。shorttemp

そう:

操作 Val & 0x0000FFFF の戻り値の型は何になりますか?

上記を参照してくださいint

temp に正しいデータを保存するには、値を (short)(Val & 0x0000FFFFF) に型キャストする必要がありますか?

オブジェクトshortの初期化時に式が暗黙的に変換されるため、上記の no を参照してください。temp

16進数は本質的に符号なし整数として扱われると想定しているため、疑問が生じます。

0x0000FFFFここは signed 型であるため、これは間違った仮定intです。

于 2013-07-23T10:41:15.970 に答える
0

Val & 0x0000FFFFVal & 0xFFFF;とまったく同じです。どちらの式も typeintであり、結果は厳密に [0,65535] の範囲内にあります。(質問者様のおっしゃる通り、32ビットint型を想定しています)。

この結果を に代入するshortと、値が より小さい場合、値は変更されませんSHRT_MAX。より大きい場合SHRT_MAX(プラットフォームではおそらく 32767)、動作は実装定義です [1]。

代わりに結果を に代入するとunsigned short、式から生じる可能性のあるすべての値を表すことができる必要があり、結果は標準によって完全に指定されます。


  1. 実際には、ほとんどすべての最近のシステムでは、結果は単純にこれらの 16 ビットを として解釈することで得られるものshortであり、これはおそらく期待どおりです。
于 2013-07-23T10:38:16.563 に答える
0

C99 言語仕様では、ビットごとの AND を実行するときに「通常の算術変換が適用される」と述べられていますが、valこれは既に整数であり、16 進定数も整数である必要があります (56 ページを参照)。intキャストと割り当ての両方でを に切り詰めるshort必要がありますが、この場合、データを失うことはありません。

于 2013-07-23T10:37:00.587 に答える