|
|
|
| 2008/10/07 11:46||▲
|
|
|
<stdint.h>は、特定の幅を持つ整数型と、それらに対応するマクロを定義しているヘッダです。このヘッダもC99から新しく導入されました。int16とかint32とかいったマクロは、既存の多くのソースコードで使用されていますが、それらに標準的な仕様を与えることが目的のようです。
まずは、ちょうどその幅を持つ整数型の定義です。"h8300-hms"ターゲットでは、char型は8ビット、short型は16ビットですので、
typedef signed char int8_t; typedef unsigned char uint8_t; typedef short int16_t; typedef unsigned short uint16_t;
というところまでは確実です。 32ビットの整数型は、int型が32ビットかどうかにもよりますが、規格を読む限りでは、int型とlong型の両方が32ビットの場合には、どちらを使ってもよさそうなので、long型にしておきます。
typedef long int32_t; typedef unsigned long uint32_t;
64ビットの整数型ですが、2つ問題があります。ひとつは、gcc-3.3.x以前のバージョンでは、"h8300-hms"ターゲットではlong long型が32ビットしかなかったことです。これについては、旧バージョンに対応するとなると影響範囲が大きいので、今回は見送ることにします。
もうひとつは、-std=c89オプションと-pedanticオプションの両方を指定した場合、long long型を使うと警告が出る問題です。この問題は__extension__を付けることで回避可能です。したがって、
__extension__ typedef long long int64_t; __extension__ typedef unsigned long long uint64_t;
とすることで解決します。
次に、最小幅を指定した整数型です。それらの型は、int_leastN_t の形式をしていますが、今回の場合、各整数型は全て 8×2n ビットですので、対応する intN_t に定義すればよさそうです。実例として8ビットのものだけを挙げますが、他も同様です。
typedef int8_t int_least8_t; typedef uint8_t uint_least8_t;
今度は、指定幅以上を持つ最も高速な整数型です。規格では、「通常、最も早く処理できる」型となっていますが、通常とはどんな場合かについて書かれていません。"h8300-hms"ターゲットの場合、汎整数拡張のコストが結構大きいので、ここでは、int型未満のものはint型として扱う方針で定義したいと思います。
typedef int int_fast8_t; typedef unsigned int uint_fast8_t; typedef int int_fast16_t; typedef unsigned int uint_fast16_t; typedef long int_fast32_t; typedef unsigned long uint_fast32_t; __extension__ typedef long long int_fast64_t; __extension__ typedef unsigned long long uint_fast64_t;
こんな感じです。
次は、最大幅を持つ整数型です。これはlong long型ですので、
__extension__ typedef long long intmax_t; __extension__ typedef unsigned long long uintmax_t;
となります。
最後は、オブジェクトを指すポインタの値を保持できる整数型です。ポインタのサイズは、H8/300およびH8/300HとH8Sのノーマルモードが16ビットで、それ以外は32ビットですから、
#if defined(__H8300__) || defined(__NORMAL_MODE__) typedef int intptr_t; typedef unsigned int uintptr_t; #else typedef long intptr_t; typedef unsigned long uintptr_t; #endif
とすることができます。
各種マクロの定義については次回に回したいと思います。
一部間違いがありましたので訂正しました。
typedef __extension__ long long int64_t; ではなく、
__extension__ typedef long long int64_t; が正解です。__extension__を用いた他の型定義も同様です。
|
| 2006/01/26 22:57|処理系の特性|TB:0|CM:0|▲
|
|
|
コメント
|
|
コメントの投稿
|
|
|
|
|
トラックバック
|
トラックバックURLはこちら
http://libc.blog47.fc2.com/tb.php/15-b790f597
|
|
|
|
|
ホーム
全記事一覧
<< 前の記事
次の記事 >>
|