
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ビット固定浮動小数
No.1ベストアンサー
- 回答日時:
可変長という表現も変ですが、C言語の型のサイズは、すべて処理系定義です。
charもshortもintもlongもlong longもfloatもdouobleもlong doubleも例外はありません。_Boolだけは確実に1ビットですが、_Bool型が占有するメモリサイズは処理系定義になります。どの処理系でも常に同じサイズで定義するのはC言語では不可能です。というのも、8ビットとか16ビットとかの型が存在しない処理系もあるからです。
現実的には、あらゆる処理系を網羅するのではなく、自分が対象とする処理系を特定し、その間で有効な手段を検討するのが一番です。
お勧めの方法は、<stdint.h>で定義される、int8_t, uint8_t, int16_t, uint16_t, ..., int64_t, uint64_tなどを使うことです。
これらは、サイズが保証されるだけでなく、負の値の内部表現が2の補数であることも保証されます。ただし、処理系によっては一部または全部の型が定義されないことがあります。思い切ってそれらの処理系を切り捨てられるのであれば、一番現実的な解決策かと思います。
なお、<stdint.h>はC99で導入されたヘッダですので、C99に未対応の処理系や非標準処理系には存在しません。それらの古い、または方言である処理系は、思い切って切り捨てるか、それが無理なら、<stdint.h>を自作する必要があります。
No.2
- 回答日時:
バイト数だけなら char とその仲間が 1バイトと決まっていますが, 実際には「1バイト」も「8ビット以上」となっているだけなので, 「全ての処理系でビット数を固定する」のは無理がありますね.
まあ, 自分で全部書けばいいんですが.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- WordPress(ワードプレス) wordpressでphpを読み込みたい 1 2022/10/30 23:40
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
getchar,isalphaについて
-
VBAのプログラムで、DIAG = 1# ...
-
参照なバリアント
-
VBAの変数のデータ型を変更する...
-
typedefをプログラム中で解除す...
-
int型とchar型について
-
VBAにてcolorindexを変数に格納...
-
構造体のデータを丸ごとコピー...
-
構造体のポインタにNULLが入らない
-
リッチテキストボックスの中身...
-
Integer変数をカラにしたいので...
-
C言語 配列の長さの上限
-
init関数の意味
-
allocってなんですか?
-
行列内の行の交換,列の交換を...
-
ポインターの使用法や利点
-
配列の要素数に変数を入れたい...
-
セグメントエラー
-
CStringからchar*への型変換に...
-
C言語のポインタに直接アドレス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
Integer変数をカラにしたいので...
-
「#undef」と「#define」の使い...
-
C言語 構造体の中に共用体を定...
-
構造体のデータを丸ごとコピー...
-
VBAの変数のデータ型を変更する...
-
日付チェック関数について
-
整数から16進数への変換 現在c...
-
typedefをプログラム中で解除す...
-
値が代入されてない時
-
C++ 構造体の一括初期化 {0}
-
VBAで符号無し整数
-
long型のデータをバイト型の配...
-
変数の初期化について
-
1バイトデータの読み出しについて
-
charとucharの違い
-
VBAにてcolorindexを変数に格納...
-
異なる構造体のデータのコピー
-
構造体を型の異なる構造体に代入
-
構造体にする理由・利点・使用例
おすすめ情報