C99に対応した標準Cライブラリの実装レポートを行っていきます。

プロフィール 

Author:高木信尚

ホームページ
ブログ

最近の記事 

最近のコメント 

最近のトラックバック 

月別アーカイブ 

カテゴリー 

ブロとも申請フォーム 

この人とブロともになる

ホーム 全記事一覧 << 前の記事 次の記事 >>

 

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:0CM:0

コメント
コメントの投稿

管理者にだけ表示を許可する


トラックバック
トラックバックURLはこちら
http://libc.blog47.fc2.com/tb.php/15-b790f597

ホーム 全記事一覧 << 前の記事 次の記事 >>

ブログ内検索 

お勧め書籍 

RSSフィード 

リンク 

このブログをリンクに追加する

Powered By FC2ブログ 

Powered By FC2ブログ
ブログやるならFC2ブログ

Copyright(C) 2006 TAKAGI Nobuhisa All rights reserved.
Powered by FC2ブログ. 無料ホームページ アフィリエイト レンタルサーバー FC2ブログ 一戸建て template designed by 遥かなるわらしべ長者への挑戦.