プロが教えるわが家の防犯対策術!

#include <stdio.h>
#include <limits.h>

int main() {
printf("%d\n%d", INT_MAX, LONG_MAX);
return 0;
}

出力
214783647
214783647

Win7 64bit (VC++2010)
CentOS 32bit (gcc)

どちらの環境でも同じ出力結果となりました。
intとlongなぜ同じになってしまったのでしょうか。

A 回答 (5件)

long は 32ビットの整数(signedの場合 -2147483648~+2147483647、unsignedの場合


0~4294967295)
int は システムにおける 標準
という定義です。

32ビットシステムの場合は同じになります。

DOS時代はシステムが 16ビットのため、intは -32768~+32767(または 0~65535)でした。

short int とすることで 16ビット互換となります。

この回答への補足

なるほど。
CPUのbit数に依存するのですか。
しかし、新たに疑問が生まれてしましました。

> 32ビットシステムの場合は同じになります。
CPU は i7 2600K
OS は Win7 64bit
を利用しています。

Intel® CoreTM i7-2600K Processor (8M Cache, up to 3.80 GHz)
http://ark.intel.com/products/52214/Intel-Core-i …

ここを見るかぎり64bitCPUなので、
intは64bit分となると思いました。
しかし、VC++ 2010コンパイラでx64としてコンパイルしても
intは64bit分(8バイト分)とらず、
2147483647
2147483647
と出力されました。
なぜなのでしょうか。

64bit CPU / 64bit OSでもintは32bitが上限なのでしょうか。
今後128bit OSや128bit CPUが出てきた時もintは32bitが上限となるのでしょうか。

補足日時:2012/04/14 11:07
    • good
    • 2

>64bit CPU / 64bit OSでもintは32bitが上限なのでしょうか。



過去、intは32bitとして扱うことが多かったので
互換性のために32bitにしてると思われます。

>今後128bit OSや128bit CPUが出てきた時もintは32bitが上限となるのでしょうか。

将来どのようになるかなんてわかりません。
    • good
    • 0
この回答へのお礼

スッキリしたのと同時に深い理解を得る事ができました。
ありがとうございました。

お礼日時:2012/04/14 11:24

たまたま両者がそういう環境だったから。



int: 少なくとも-32767~32767の整数が扱える。
long: 少なくとも-2147483647~2147483647の整数が扱える。
扱える値の範囲が long >= int

上記の条件さえみたせばC(C99)としては問題ありませんので。

ちなみにLONG_MAXを出力するなら
>printf("%d\n%d", INT_MAX, LONG_MAX);
のフォーマットは不適切です。

この回答への補足

> ちなみにLONG_MAXを出力するなら
> >printf("%d\n%d", INT_MAX, LONG_MAX);
> のフォーマットは不適切です。
たしかにその通りです。
printf("%d\n%ld", INT_MAX, LONG_MAX);
とすべきでした。

補足日時:2012/04/14 11:15
    • good
    • 2

int型はコンパイラによって、ビット長が変わります。



基本的にCPUのビット数がint型のビット長となります。

16ビット以下のシステムでは、int型は暗黙の了解で16ビットとなるものが多いです。

16ビット型の整数として使いたい場合は、short型を使用してください。

int型のサイズが知りたい場合は、INT_MAXを使うか、sizeof関数を使用してください。

この回答への補足

> 基本的にCPUのビット数がint型のビット長となります。
No.1 / No.2 さんへの補足と被りますが、
64bit CPUであれば64bit = 8バイト
128bit CPUであれば128bit = 16バイト
となるのでしょうか。

補足日時:2012/04/14 11:17
    • good
    • 2

int は、そのCPUに適したサイズになります、8ビットのCPU なら1バイト 16ビットのCPUなら2バイト 32ビットのCPUなら4バイト


32bit の gcc なので4バイトになったと思われます。

この回答への補足

No.1さんへの補足とほぼ被りますが、
64bit CPUであれば64bit = 8バイト
128bit CPUであれば128bit = 16バイト
となるのでしょうか。

補足日時:2012/04/14 11:16
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています