プロが教える店舗&オフィスのセキュリティ対策術

32bitプラットフォーム上で、128bitアプリケーションを実装しようと試みています。32-bit変数または64-bit変数はサポートされているのですが、128bit変数はサポートされていません。

このような環境なのですが、プログラミングを楽にするため、またコードの可読性を確保するため、普段は128bitの変数として宣言しておき、必要に応じてその中の32-bitや64-bitのみを取り出して処理に使うようなコードを書きたいです。

このような場合、コード記述としては、構造体、つまり、
#include <stdint.h>
...
struct uint128_t{
uint64_t lo;
uint64_t hi;
}
または
struct uint128_t{
uint32_t x;
uint32_t y;
uint32_t z;
uint32_t w;
}
のようにするのが一般的な方法なのでしょうか?

周りにコードを書く人がいないため、初歩的な質問で恐縮ですが、こちらで質問させて頂きます。
よろしくお願いします。

A 回答 (2件)

ご使用されてるコンパイラに128bit変数のための型が定義されていないのであれば、ご質問者さまが記載したような実装で良いと思いました。

    • good
    • 1
この回答へのお礼

ありがとうございます! ふだん、コードに関する相談ができないので、そう言っていただくだけでも安心しました!

お礼日時:2017/01/04 22:16

目的は 128bit 符号なし整数の単純な保存という意味ではこれでもいいかもしれませんが、いくつか前提条件があります。



この構造体は下位先行型プロセッサー (Intel、VAX など) ではこれでいいのですが、上位先行型プロセッサー (PPC、Spark など) に移植する時には順序が逆になってしまいます。

また、通信ソフトの世界では常に上位先行で送信するのがルールです。

移植性を重視するコーディングに拘るなら、16x8bit のスタイルにして、

struct uint128_t {
unsigned char bF;
unsigned char bE;
unsigned char bD;
unsigned char bC;
unsigned char bB;
unsigned char bA;
unsigned char b9;
unsigned char b8;
unsigned char b7;
unsigned char b6;
unsigned char b5;
unsigned char b4;
unsigned char b3;
unsigned char b2;
unsigned char b1;
unsigned char b0;
};

または、

struct uint128_t {
unsigned char b[8];
};

とした方がいいと思います。
C 言語ではキャリーアンドボローの概念が実装されていないので、構造体の四則演算を関数定義する場合にも、バイト単位の方が移植性の高いプログラムとなります。後者の場合、将来 256bit に拡張することも容易にできます。

特に、貴方が提案した 2x64bit 方式では、繰り上がりのある演算が定義できません。

ただ、これでは演算速度に問題があるという場合には、

#if sizeof(long)

などを使って手動で最適化を図る必要があるかも知れません。

尚、特定の処理系 (x86 か x64) に限定しても良いプログラムならば、

#pragma

を使ってアセンブラマクロにしてしまうのも手です。この場合でも、処理系に依存しないコーディングスタイルを併記しておくことをお勧めします。
    • good
    • 1
この回答へのお礼

なるほど、勉強になります!他プラットフォームへの移植性のことまでは正直考えていませんでした。

書き込んでいただいた内容を自分なりに勉強して、精進したいと思います。
ありがとうございました!

お礼日時:2017/01/04 22:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!