読者です 読者をやめる 読者になる 読者になる

数値定数について

c c89 c99

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件) を見る