Cリファレンスマニュアルを読んでいると数値定数について
知らなかったことがいくつかあったのでメモ。
"0x"をつけた数字は C89以降では unsigned int以上で扱われる。
C89では可能性として long, unsigned longもあるんですけど、
規則によるとオーバーフローしない最小の型が選ばれるという
ことになっているみたい。32ビットであればたぶん unsigned int
になるはずですね。
シフト演算は unsignedでやるべきということで数値の後ろに
"U"をつけていましたけど、16進数表記でやれば問題なさそう
ですね。
それともう一つ知ったのはC99では32ビット以上の数値定数を
書くと "long long"になるということ。一回なんか一致しない
な〜って思っていたら16進数で 9桁書いていたことがありました。
それは 64ビットシステムだったのでそのせいかなって思って
いたんですけど、C99のせいだったんですね。知りませんでした。
確認するためのサンプルコードを書いてみました。
#include <stdio.h> int main(void) { printf("sizeof unsigned int = %ld\n", sizeof(unsigned int)); printf("sizeof long = %ld\n", sizeof(long)); printf("sizeof long long = %ld\n", sizeof(long long)); printf("sizeof 0x80000000 = %ld\n", sizeof(0x80000000)); printf("sizeof 0x100000000 = %ld\n", sizeof(0x100000000)); return 0; }
結果は以下のような具合
% ./longlong sizeof unsigned int = 4 sizeof long = 8 sizeof long long = 8 sizeof 0x80000000 = 4 sizeof 0x100000000 = 8
どうでもいいけど、Macって 32ビットモードで起動しても
longが 8byteなんですね。今知りました。

S・P・ハービソン3世とG・L・スティール・ジュニアのCリファレンスマニュアル
- 作者: 3世,サムエル・P.ハービソン,ガイ・L.,ジュニアスティール,3,Samuel P. Harbison,Guy L.,Jr. Steele,玉井浩
- 出版社/メーカー: エスアイビーアクセス
- 発売日: 2008/10
- メディア: 単行本
- 購入: 9人 クリック: 110回
- この商品を含むブログ (20件) を見る