• ベストアンサー

C で、a、b、c が16ビット符号無し整数のとき

C で、a、b、c が16ビット符号無し整数のとき、 a = 0x7FFF * b / c; の途中結果の 0x7FFF * b は 16ビット符号無し整数として処理されるのですか。32ビットで処理してくれたら便利なのですが。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

Cの規格は確認してませんが、普通のCコンパイラだと、1 とか 0x7FFF のような数字定数はint型です。 int型が32bitのコンパイラを使っていれば、全部32bitで計算されます。

ahkrkr
質問者

お礼

回答ありがとうございます。

その他の回答 (6)

回答No.7

>途中結果の 0x7FFF * b は 16ビット符号無し整数として処理されるのですか。32ビットで処理してくれたら便利なのですが。 0x7FFFは「int型定数」ですから「int型 * 整数型はint型」と言う規則により、int型になります。 「int型が何ビットの整数なのか?」は、処理系に依存するので、何ビットになるかは判りません。 「符号+15ビット」と言う処理系では「符号+15ビット」になり、「符号+31ビット」と言う処理系では「符号+31ビット」になります。

ahkrkr
質問者

お礼

回答ありがとうございます。 私が使っている処理系では int型が 32ビットなので、希望どおりの処理になっているようですね。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.6

32ビットちょうどの整数型が存在するかどうかは処理系によって異なります。 けれども、32ビット以上であればよいのなら、次のようにすることで解決します。 a = (int_least32_t)0x7fff * b / c; または a = INT32_C(0x7fff) * b / c; いずれの場合も <stdint.h> をインクルードしてください。

ahkrkr
質問者

お礼

回答ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

はい, キャストしようと何しようと「必ず 32ビットで処理してもらう」絶対的な方法は存在しません. そもそも「ぴったり 32ビットのデータ型」というものが存在することすら保証されていません. 例えば short: 16ビット int: 24ビット long: 48ビット long long: 96ビット という処理系があってもかまわないのです.

ahkrkr
質問者

お礼

回答ありがとうございます。 なるほどそういう意味ですか。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

処理系によります。 型の指示(U 等)がなければ、整数リテラルはint型になります。 つまり (int)(0x7fff) です。 整数同士の演算では、基本「大きい」ほうに自動で型変換されます。 (int)(0x7fff) * b の段階で、7fffが 「int →16ビット符号無し整数」 または、bが「16ビット符号無し整数→int」に、型変換されます。 まわりくどい書き方をしているのは、 intが何ビットか不明だからです。 intが16ビットで、16ビット符号無し整数とは unsigned int のこと、という処理系もあります。 intが32ビット、16ビット符号無し整数とは unsigned short だったとすれば、その式は次のようなキャストしたものと同等になります a = ( unsigned short) ( (int)0x7FFF * (int)b / (int)c ); /* 32ビットで計算した結果のうち、16ビットをaに代入 */

ahkrkr
質問者

お礼

回答ありがとうございました。 よく分かりました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

この辺はほとんど処理系定義の世界. 本件については #1 の通り「コンパイラによって異なる」が正解. そして厳密には「必ず 32ビットで処理してもらう」方法も存在しない.

ahkrkr
質問者

お礼

回答ありがとうございます。 キャストしても、32ビットで処理できるわけではないということですか。

回答No.1

お使いになられているコンパイラによっても異なると思います. キャスト演算子を具体的に指定することで回避できると思います. 例えばですが,こんなイメージではどうでしょうか. a = (unsigned short)((unsigned long)0x7FFF * (unsigned long)b) / c;

ahkrkr
質問者

お礼

回答ありがとうございます。 やはりキャストが必要ですね。

関連するQ&A

専門家に質問してみよう