はじめに
今回は型宣言の仕方について、移植性の面で示します。こちらもMISRA-Cで規定されていますので、そちらも気になる人は見て頂ければと思います。では行ってみましょう。
基本型は使用しない。代わりにtypedefした型を使用する
(1)char、int、long、long long、float、double及び
long doubleという基本型は使用しない。代わりに
typedefした型を使用する。《プロジェクトで利用する
typedefした型を規定する。》
(2) char、int、long、long long、float、double及び
long doubleという基本型を、そのサイズに依存する
形式で使用する場合、各基本型をtypedefした型を使
用する。《プロジェクトで利用するtypedef型を規定
す る 。》
適合例
(1)、( 2)の適合例
uint32_t flag32; // 32bitを仮定する場合、
// uint32_tを利用
(2)の適合例
int i;
for (i = 0; i < 10; i++) { … }
// iはインデックスとして利用 < 8bitでも、16bitでも、
// 32bitでもOKであり、言語仕様の基本型を利用して
// OK
不適合例
(1)、( 2)の不適合例
uns igned int flag32; // intを32bitと
// 仮定して利用
整数型や浮動小数点型のサイズと内部表現はコンパイラによって異なる。
整数型や浮動小数点型のサイズと内部表現はコンパイラによって異なる。
C99では、言語規格として次のtypedefを提供することが規定されているため、この型定義を利用する。
また、C90の場合は、この名前を参考にするとよい。
サイズ指定型:
int8_t、int16_t、int32_t、int64_t、uint8_t、uint16_t、uint32_t、uint64_t
最小幅指定整数型:
int_least8_t、uint_least8_t、・・・、int_least64_t、uint_least64_t
最速最小幅整数型:
int_fast8_t、uint_fast8_t、・・・、int_fast64_t、uint_fast64_t
最大幅整数型:
intmax_t、uintmax_t
その他
また、sizeofで求めた結果などのサイズや長さにはsize_t、
ポインタ減算の結果にはptrdiff_t、
ワイド文字にはwchar_tを利用する。
size_tは何ビット?
size_tのビット数は、使用されるプラットフォームやコンパイラによって異なります。主な特徴は以下の通りです:ちなみに、ビット数でなく、バイト数です。
プラットフォーム依存:
size_tは、システムのアドレス空間のサイズを表現できる無符号整数型です。
一般的なサイズ:
- 32ビットシステム: 通常4バイト(32ビット)
- 64ビットシステム: 通常8バイト(64ビット)2
最小サイズ:
C言語の仕様上、size_tは少なくとも16ビット以上の符号なし整数型である必要があります。
目的:
メモリ上のサイズやインデックスを表すために使用され、配列の要素数や文字列の長さなどを扱うのに適しています
可搬性:
size_tを使用することで、異なるプラットフォーム間でのコードの移植性が向上します。
したがって、size_tの正確なビット数は環境によって変わりますが、一般的には32ビットまたは64ビットとなります。プログラムの移植性を考慮する場合、特定のビット数を前提とせず、size_tの特性を理解して適切に使用することが重要です。
最後に
今回は、型定義について書いてみました。その中でsize_tが出てきましたが、配列要素数を出すのに、
1.sizeof演算子で配列全体のバイト数を取得する
2.sizeof演算子で要素のバイト数を取得する
3.配列全体のバイト数を要素のバイト数で割る
っていうのを思い出しました。
ちょっと理解が進みました。小さなことからコツコツとやっていきたいです。
|
コメント