• ベストアンサー

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

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

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

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

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

ahkrkr
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (6)

  • chie65535
  • ベストアンサー率44% (8566/19463)
回答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

  • 4ビットの符号付整数

    4ビットの符号付整数0101が表す整数の10進法表記は?

  • 符号付の整数8ビット…

    教えてください。 符号付整数8ビットの2の補数で表現するときの11101111-11110011の計算を2進数で示すときの途中の計算方法を教えてください。 10進数のー13を8ビットの固定小数点(負数は2mの補数形式)の途中の計算方法も教えてください。

  • 符号無し整数xを右にnビット回転

    C言語勉強中です。本、例題の中に、 符号無し整数xを右にnビット回転した値を返す関数rrotateと、 左にnビット回転した値を返す関数lrotate unsigned rrotate(unsigned x, int n) unsigned lrotate(unsigned x, int n) を作成せよ。 という例題がありました。 この例題の中の回転とは、どのような意味なのでしょうか? 何をどのようにしたらよいか、問題の意味がわかりません。 解る方教えてください。よろしくお願いします。

  • 9ビットの2進数を符号付整数…

    問題の意味がわからないのですが、どう解けばいいですか? 9ビットの2進数を符号付の整数とみなしたときの数値の範囲を、10進数で下限~上限の形で示せ。符号は2の補数。

  • 4個の整数、1,a,b,cは、1<a<b<cをみたしている。これらの中

    4個の整数、1,a,b,cは、1<a<b<cをみたしている。これらの中から相異なる2個を取り出して和をつくると、1+aからb+cまでのすべての整数の値が得られるという、a,b,c,の値を求めよ。 問題の意味として、1+aからb+cの真の整数は1も飛ばさずにすべて得られる ということなのでしょうか? 問題の意味すら曖昧でよくわからないです。 解き方を教えてください。

  • a^2+b^2+c^2>250を満たすa,b,c(1から10の整数)は?

    a^2+b^2+c^2>250 という式が与えられ、 整数a,b,cは1から10の範囲にあります。 a,b,cの組を見つけるのですが、2連続ミスりました。 このようなミスがなぜ起こったのかを数学に 慣れた方から聞いてみたいと思いました。 たぶん思い込みが根底にあると思うのですが、 できる人ならこんな簡単な問題を間違わないと思うので、 経験以外の何かしらの問題に取り組む際の姿勢みたいなものが 不足しているのかなぁとか思うのですが。 できれば下の解答を見る前に解いていただければと思います。 私の解き方はまず9^2を3つ足してみて、243だから、 次に9^2を2つと10^2を足して、262でOKなので、更に (a,b,c)=(9,10,10),(10,10,10)を加え、 (a,b,c)=(9,9,10),(9,10,10),(10,10,10) を答えとしましたが実際はひとつ抜けていて、 (a,b,c)=(8,10,10),(9,9,10),(9,10,10),(10,10,10)でした。

  • abc=a+b+c (1≦a≦b≦c) を満たす整数a,b,c

    タイトルの通り、 1≦a≦b≦c かつ abc=a+b+c を満たす整数a,b,cの組を求めよ。 という問題なのですが… (a,b,c)=(1,2,3) しかありませんよね? それはわかるのですが、この答えはぱっと見で思いついただけで、実際に文字を使ってそれが正しいことが証明できません。 どのようにやるのでしょうか。 お願いします。

  • a^b = b^a 0<a<b を満たす整数の組

    y=x^(1/x)(x>0)のグラフを用いて a^b = b^a 0<a<b を満たす整数の組を求めたいのですが どのように求めたらいいのでしょうか?

  • 次の整数Aを整数Bで割り、商Qと余りRを求めなさい。

    次の整数Aを整数Bで割り、商Qと余りRを求めなさい。 そしてその結果をA=BQ+Rの形で書きなさい。 A=5X三乗-4X二乗+7X-8 B=5X二乗+x-1 の解き方がわかりません。 どなたか教えてください。お願いします。

  • a,b,cはa^2-3b^2=c^2を満たす整数とするとき、次のことを

    a,b,cはa^2-3b^2=c^2を満たす整数とするとき、次のことを証明せよ。 1、a,bの少なくとも一方は偶数である。 2、a,bが共に偶数なら、少なくとも一方は4の倍数である。 3、aが奇数ならbは4の倍数である。 という問題です。 1はa,bを奇数として、2m+1,2n+1とおいて計算したのですが、いまいちどう証明したらよいのか分かりません。 2はどちらも2m,2nとして計算したら、4(m^2-3n^2)=c^2となったのですが、これで何の証明になるのか…。 3もよく分かりません。 勉強不足で申し訳ありません。考え方だけでも教えてください。よろしくお願いします。

小さな入れ物の使い道は?
このQ&Aのポイント
  • 小さな入れ物の使い道について教えてください。
  • この小さな入れ物はどのように活用できますか?
  • 使い道のアイデアを教えてください。
回答を見る