• 締切済み

C++推奨のデータ型

OS/実装依存のないデータ型を使用してC++のハードウェアモデルを書こうとしています。その為、ビット表現が連想できるデータ型を使用したいと思っているのですが、 今までのCで書いたモデルでは、 uint8_t/uint32_t等を使っていましたが、 C++で何か推奨のデータ型があるかとぐぐって見ると Wikipedia 整数型 のページではuint8_tはC言語というカテゴリ扱いになっており、C/C++はint/long等となっていました。 uint8_t等を使うことはC++では推奨されていないのでしょうか。

みんなの回答

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

uint8_tなどはC99の<stdint.h>で定義される型です。現行のC++規格はC99より前のCをベースにしていますので、これらの型定義はありません。 ただし、CコンパイラがC99に対応している処理系であれば、C++でも<stdint.h>が使えるかと思います。しかし、 > OS/実装依存のない ということが条件なので、そうした拡張に依存するのはよくないですね。 ちなみにC99の場合であっても、uint8_tやuint32_tは任意実装です。確実にどんな処理系でも(フリースタンディング環境であっても)サポートされるのは、uint_least8_tとかuint_least32_t、あるいはuint_fast8_tとかuint_fast32_tということになります。 ところで、uintN_tなどは、その整数型のビット数を特定することはできますが、詳細な振る舞いが一見しただけでは分かりにくくなる嫌いがあります。 まず、関数の多重定義を解決する場合、実際にどの関数が呼ばれるのかは、uintN_tの定義を調べてみるまでわからなくなります。 次に、uint16_tのような型の場合、汎整数昇格によってint型になるのかunsigned int型になるのかが処理系に依存してしまいますので、慎重に扱わないと予期しない結果にとまどうことになります。

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

関連するQ&A

  • Cと変数と私。 (´・ω・`)

    basicしか使えない者です。 cにはなぜ変数のデータ型がたくさんありますか。 なんか5種類くらいあったような気がするんですけど。 整数型とか倍長整数型とかは厳密に使い分けないとダメですか。 いたずらでintをlongに書き換えたら怒られますか。

  • C言語の変数の型がわかりません

    C言語の変数の型がわかりません [int]は4バイトを使って整数(-2147483648~2147483648)を格納できる. [long int]は4バイトを使って整数(-2147483648~2147483648)を格納できる. のようなことが書いてあります. [int]と[long int]の違いは何ですか?

  • C++のDLLをJAVAで実行→うまく行かない。。

    Java素人です。ちょっと教えてほしいです。 以下のC++は問題なく動作します。 //C++ヘッダの記述 VC_Header_API int _stdcall GET_DATA(UINT32* abcData, int* Count); //C++の記述 UINT32* abcData; abcData= (UINT32*)malloc(128 * 512 * 1024 * sizeof(UINT32)); int Count= 0; return= GET_DATA(abcData, &Count); //→ 正しい値が取れる。適当な数字の羅列データ しかしJavaでは、結果の戻り値が取れなくて。。。 //Javaの記述 (中略です) //C++ Function name int SET_DATA(int setData, byte[] Err); int GET_DATA(int[] abcData, int[] Count); byte[] Err = new byte[128]; int[] abcData= new int[100000]; int[] Count= new int[1000]; return = abcDLL.INSTANCE.GET_DATA(5555, Err); //→問題なく動作します。Errの文字コードも取れます。 return = abcDLL.INSTANCE.GET_DATA(abcData, Count); //→これを実行したとき、abcデータとCountがすべて”0”... 正しい値が入ってこないのは、abcData, Countの渡し方の問題だと思われるんですが。。。 他の関数は問題なく動作可能です。 問題ない渡し方、分かりますでしょうか?アドバイスいただきたいです。 よろしくお願いいたします。

  • C言語の定数のサフィックスについて

    C言語に詳しい方はおバカな質問をしていると思われるかもしれませんが、当方はソフトは初心者なのでご容赦ください。 C言語で定数を扱う際に一定以上のサイズの定数の場合L、UL等のサフィックスを付けないと正常に処理されない(例:0x0123456789ABCDEFという定数はサフィックス無しだと0x89ABCDEFとして処理される)仕様になっている事は把握しているのですが、この一定サイズについてご教授願います。 int、long等は処理系によってサイズが何bitになるかが変わりますが、intが16bitの場合は32bitの定数でもサフィックスにL、UL等を付けなければいけないのでしょうか? それともintのサイズに関係なく32bit以下ならサフィックスは不要で、32bitを超える場合はサフィックスが必要になるのでしょうか? また、処理系に依存せず一定のサイズの変数を宣言するのにint32_t、int64_t等がありますが、サフィックスにも同様に処理系に依存せずサイズを明確にする物はあるのでしょうか? 例えば0x0123456789ABCDEFULLとした場合、long longが32bitの場合は32bitの定数として扱われてしまうと思うのですが、定数を処理系に依存せずに確実に64bitとして処理してほしい場合はどの様にすれば良いのでしょうか? (あるサイトに"GCCではlong longが64bitのサイズになるが言語仕様上はビット長は保証されていない"と言う記載があった事から、サフィクスにLLやULLを使用しても64bitで処理される保証が無いと思い、この質問をさせて頂いています。)

  • C言語 バイナリデータのサイズの調べ方

    windows7 64bitでcygwinを使用しています。 32bitを1つの組として、いくつかの組で構成されたバイナリデータがあります。 このバイナリデータにいくつの組があるのか調べるため、以下のようなソースを記述したのですが、うまくいきません。 どこを修正すればよろしいでしょうか。 御教授願います。 int main() { long long int i; long long int hex[1]; long long int aaaa; int bb; int ret; FILE * fp; i = 1; bb = 1; for(;;){ fp = fopen("kimi.dat", "r"); bb = fread(&hex[1],4,i,fp); aaaa = i; i = aaaa + 1; ret = fclose(fp); if (bb != aaaa) { printf("%lld\n",aaaa); printf("%lld\n",i); printf("%d\n",bb); exit(1); } } } gcc -std=c99でコンパイルしました。 結果は 1431440333 1431440334 1 のように表示されました。 データファイルは900MB以上あります。

  • c# チェックか符号なしか

     こんにちは。c#初心者です。  よくインデックスなどで引数が負数でないかのチェックを行いますが、その代わりに引数を符号なし整数、例えば「uint」にしてしまうというのはどうなのでしょうか?  初心者から見た長所は負数のチェックを行うより「int」から「uint」へのキャストのほうがやや高速(とはいっても全体的なパフォーマンスへの影響は薄い)。利用側が、負数がダメだと”やや”わかりやすくなる。  短所は「checked」がないと負数でオーバーフローを起こしても放置されること。(uint)が至る所に発生してむしろ可読性が下がるかもしれないことと、面倒になること(これは大きいかもしれない)。 (負数のチェックだけでなく上限のチェックが必要な場合は「int」、「uint」かかわらずチェックするので「uint」だからといって超えすぎる心配はなく、その場合、オーバーフローも間接的に例外として検出される)  という感じなのですが、なにせ初心者なわけで、皆さんのご意見をうかがわせてもらえませんか?

  • c言語で配列を返したい

    自分がc言語で書いているプログラムの関数で次のようなものがあるのですが、 int CTR(int data[], int* key, long long t){ int buf[sizeof(data)]; int tmp[16]; int bytesoft[128]; int i,j; KeyExpansion(key); for(i=0;i<sizeof(data);i+=16){ for(j=0;j<16;j++){ if(j<sizeof(bytesoft)) tmp[16-j-1]=bytesoft[sizeof(bytesoft)-j-1]; else tmp[16-j-1]=0; } Cipher(data); for(j=0;j<16;j++){ buf[i+j] ^= data[i+j]; } t=t+1; } return buf; } 配列bufを返すためには、ポインタを用いればいいということは調べて分かったのですが具体的にどのように書き換えればいいかよくわかりません。 どなたかご教授いただけないでしょうか?

  • 型について

    Cの型の中にint と long int がありますけどこの違いは何なのでしょうか?本にはどちらも4ビットの整数(long intは長整数となっていますが)-2147486648~2147483647となっていますが・・。 同様にdouble と long double は何が違うのでしょうか? 初歩的なところですがよろしくおねがいします。

  • C# 配列のスタックは可能でしょうか?

    C# でスタックは、次のように実装されます Stack<int> _Stack = new Stack<int>(); この場合、_Stack は、1次元のデータです。 これが、2次元配列、多次元配列でもスタックを実装することが可能でしょうか? 可能ならば実装方法もおしえていただければ幸いです。

  • 固定長なデータ型の定義

    int型などは可変長型なのでサイズは16ビット、32ビット、 64ビットなどC言語だと環境によって異なってきますよね? さらにlong型は32ビット64ビットの可変長でも、 long long型は64ビット固定長型であったり、 long int型は32ビットが保証値だとか、 shortを付けるとサイズが小さくなるのかだとか、 非常に煩わしいのでどの環境でも常に同じサイズで定義できるよう 全てtypedefで固定長にしたいと考えています。 (できれば__int32等は言語仕様では無いので使いたくないので…) ですが検索するとどうも情報が各サイトごとに微妙に違ってたりして 私には正しいかどうかの判断が付かなくなってしまいました。 (C言語以外もあったのでそのせいかもしれませんが;) 以下のように、8ビット、16ビット、32ビット、64ビット、 32ビット浮動小数、64ビット浮動小数を定義したいのですが どうかアドバイスをいただけないでしょうか? 宜しくお願い致します typedef int8   signed char; // -127~127 typedef int16  //16ビット固定整数 typedef int32  //32ビット固定整数 typedef int64  //64ビット固定整数 typedef dec32  //32ビット固定浮動小数 typedef dec64  //64ビット固定浮動小数