Cの仕様では組み込み型(int, short, longなど)のビット幅は決まっていません。環境によってint型のビット幅が32だったり16だったり8だったりします。ですが、マイコンのプログラムをPCに移植する場合などはこれでは困ります。そのため移植性を考えた場合はそれらの型を使う代わりにstdint.hでtypedefされている型を使うべきです。
ビット幅 | 符号 | 型名 | AVRの場合 |
---|---|---|---|
8 | 無 | uint8_t | unsigned char |
8 | 有 | int8_t | signed char |
16 | 無 | uint16_t | unsigned int |
16 | 有 | int16_t | signed int |
32 | 無 | uint32_t | unsigned long int |
32 | 有 | int32_t | signed long int |
64 | 無 | uint64_t | unsigned long long int |
64 | 有 | int64_t | signed long long int |
このほかにも少なくともN bit幅の型であるint_leastN_tや、少なくともN bitの幅を持つ最も演算の速い型であるint_fastN_tという型もtypedefされています。(符号なしの場合は先頭にuをつける)
ただしこれらの型はC99で追加された規格なので一部のコンパイラでは対応していないかもしれません。gccの場合は、-std=c99もしくは-std=gnu99というオプションをつけるとうまくいきます。
by Shiozaki
参考:
avr-libc: <stdint.h>: Standard Integer Types
ご参考までに
これらの定義はC99から導入されました。ANSI CやC89のみ準拠のコンパイラではそもそもstdint.hがないかもしれません。by Y.O
そいえば前回突っ込み忘れましたがintが8bitはさすがにC言語規約違反です。gccのオプションで指定はできますけどね。
参考: http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/AVR-Options.html#AVR-Options
[…] C言語の言語仕様ではビット幅が固定の型にあるように型のサイズが決められていません。浮動小数点型においてもこれは例外ではなく、floatとdoubleも必ず4バイト、8バイトではありませ […]