• ベストアンサー

128ビット変数の符合表現について

C言語で符号付128ビット変数を4つの32ビット変数(signed longまたはunsigned long)で表現したいと思っています。 この場合32ビット変数の符合付き/符合なしはどのように組み合わせるのが適切なのでしょうか。 一応3通りの方法を考えてはみました。 (1)が適切な気もするのですが違う気もします。 アドバイスをお願いします。 (1) 最上位32ビット変数をsigned longにして残りの3つの32ビット変数はunsigned longにする。 (2) 4つの32ビット変数を全てsigned longにする。 (3) 4つの32ビット変数を全てunsigned longにする。

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

  • ベストアンサー
  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.2

こんにちわ。 どの方法でも良いのではないでしょうか? 128bit の値を格納する領域があれば、格納するデータ型がsigned long であろうと、unsigned long であろうが、問題はありません。 気を付ける事は、128bit 変数のBoundary 調整の問題です。 → 128bit の変数が、何バイト単位に整列されるかと言う事です。 これは、OS によって異なりますが、通常はlong 型の配列を使用すれば 問題はありません。 安全性を考えるなら、malloc で動的に領域を獲得して下さい。 → malloc すると、自動的にBoundary 調整された領域が獲得されます。

_hitoshi_
質問者

お礼

Boundary調整の問題はないようです。 回答をありがとうございました。 返答が遅くなり、申し訳ありませんでした。

その他の回答 (1)

回答No.1

それぞれで実装してみて、いちばんしっくりいくやつを採用すればいいんじゃないでしょか。ヒトに訊くまでもなく。

_hitoshi_
質問者

お礼

Cで記述する符合なしと符合つきが、CPUの処理に、どのように影響するのかを理解していなかったため、このような疑問が生じてしまいました。 私の目的とする処理を考える限りにおいては、どの方法を採用しても、問題はないようでした。 回答をありがとうございました。 返答が遅くなり、申し訳ありませんでした。

関連するQ&A

  • MicroC コンパイラ 変数宣言

    MicroC コンパイラ 変数宣言について質問です BYTE tmp1; WORD tmp2; なる定義があったとして 変数型範囲はどの範囲になるのでしょう 下記の定義は見つかったのですが 上記は分かりません 変数型 バイト数 範囲 (unsigned) char 1 0 .. 255 signed char 1 - 128 .. 127 (signed) short (int) 1 - 128 .. 127 unsigned short (int) 1 0 .. 255 (signed) int 2 -32768 .. 32767 unsigned (int) 2 0 .. 65535 (signed) long (int) 4 -2147483648 .. 2147483647 unsigned long (int) 4 0 .. 4294967295 float 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038 double 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038 long double 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038

  • C言語signed long long型の演算

    C言語で以下の演算を行った場合、変数bに格納される値が-1(0xFFFFFFFFFFFFFFFF)になることを期待しておりましたが、参照すると4294967295(0x00000000FFFFFFFF)となってしまいます。 unsigned int a = 1; signed long long b; b = a * (-1); 32bit、64bitのUNIX(Solaris)マシンでそれぞれ確認しましたが、どちらも同じ結果となりました。 変数aの型宣言をsigned intにすると変数bが-1(0xFFFFFFFFFFFFFFFF)になることは確認したのですが、unsigned intだとなぜこのような演算結果となるのかが分かりません。 ※8バイト整数に格納する際に先頭4バイトがなぜ0xFFFFFFFFで補完されないのか? ちなみに変数bの型宣言をsigned long intにすると32bitマシンでは-1となりましたが、64bitマシンでは4294967295となってしまいます。 これは32bitUNIXマシンではsigned long intは4バイト領域であるため-1(0xFFFFFFFF)となり、64bitUNIXマシンでは8バイト領域のため前述と同じ結果になるのだと考えますが、なぜ8バイト整数を使用するとこのような演算が行われるのかが分からないので、演算順序や型変換の優先順位がどのように行われいるのか説明できる方教えてください。

  • ビット数と表現できる数の範囲の関係

    基本情報技術者の勉強を独学でしています。 nビットを用いると、符号なし整数なら0~2^n-1の範囲、符号付整数なら2^(n-1)~2^(n-1)-1の範囲の値を表す事ができると参考書にありました。 ここで気になったのですが、もしn=2の場合、符号付き整数は-2~1の範囲にある4(2^2)個が表現できる事になりますよね? 00が0、01が1、11が-1までは納得がいくのですが 10を-2として扱って良いのかわからなくなってしまいました。 これはどのように考えれば良いのでしょうか?

  • プログラミングにビットについて

    独学でプログラミングを勉強しているものですが、ビットについてまだ完全に理解できていません。 ビットというのは、メモリだとか、容量だとかという大雑把なことは分かっているのですが 詳しく完全に理解できてるわけではありません。 そこで 今日変数の復習をしていた所 教本の説明の欄の ○○(数字)ビット符号付き整数 みたいなものに疑問をもちまして 例えばintなら32ビット符号付き整数というような説明の形なのですが この場合のintの説明の解釈というのは 二進数で0一つで1ビットを占めているとして 32ビット符号付き整数というのは 二進数で言う+(-)0x31の数値を表現することができ、 なので この場合、+(-)を1ビット占めているので表現できる数字は10進数で言う+(-)2^31-1が限界ということでいいのでしょうか?

  • 64bit → 32bit型へのキャスト

    long 64data = 1; int 32data = (int)64data; 64bitの変数で上位32bitは使わない場合、int型の変数にキャストして代入することは可能ですか?

  • byte変数の大小を効率よく比較したい

    2つのbyte変数の比較を行いたいのですが、 byte aaa = 0x00; byte bbb = (byte)0xff; if(aaa > bbb){ 処理 } のようにするとbyteの最上位bitは符号として扱われるため 0xff=-127となってしまい意図した結果が得られません。 unsigned byteなるものがあれば都合がよいのですが、javaではサポートしておらず困っております。 代替案として、 if(aaa&0xff > bbb&0xff) などとして、一度intへ変換後比較すれば可能ですが、int用のメモリ領域を作成しなくてはならず、非効率の気がします。 byte変数の比較で、他に効率のよい方法はりませんでしょうか?

    • ベストアンサー
    • Java
  • 変数の扱える範囲

    C言語で、整数型変数の扱える範囲を確認するために 以下のような処理をしているのですが、どうもうまくいきません。 変数に入りうる最大値の値を、2進数の計算ではなく プログラム内で正しく扱われているか確認する方法はないでしょうか? ご存知の方、教えてください<(_ _)> 宜しくお願いいたします。 **********************************************  unsigned long long I; unsigned long A; unsigned int B; unsigned short C; printf("I:%d A:%d byte B:%d byte C:%d byte \n"    ,sizeof(I),sizeof(A),sizeof(B),sizeof(C)); A = B = C = 0; for(I = 0; I <= 4294967295; I++){ A++;B++;C++; if(I>= 4294967290 && I<= 4294967295)    printf("I:%d A:%d B:%d C:%d\n",I,A,B,C); }

  • C言語で確保できるビットの桁数

    C言語でビット単位でデータ操作する際に、確保できるビットの桁数はたとえば以下のような例の場合 unsigned char bit; 1バイト(=8ビット)なので8桁ということは勉強しました。 ここで、たとえば計算でビットの桁数を100桁用意したい場合 以下のように32*4桁という風に分ける方法しかないのでしょうか? unsigned int bit[4]; できれば一つの変数で済ませたいのですが、何か良い方法をご存知の方いらっしゃいましたらよろしくお願いします。

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

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

  • 私は現在、職業訓練校にて勉強し始めた初心者です。

    私は現在、職業訓練校にて勉強し始めた初心者です。 C言語の ”char型”の使い分けが解からなく困っております。 本では char型 0~255 又は -127~127 signed char型 -127~127 unsigned char型 0~255 となっており、具体的には”char型”はどう使い分けるのか解かりません。 又、符号付と符号無し以外に存在する意味が解かりません。 どうぞ宜しく御願い致します。