数値定数について

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リファレンスマニュアル

S・P・ハービソン3世とG・L・スティール・ジュニアのCリファレンスマニュアル

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