• ベストアンサー

intとlongは同じ?

#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なぜ同じになってしまったのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • hisa1972
  • ベストアンサー率53% (268/500)
回答No.1

long は 32ビットの整数(signedの場合 -2147483648~+2147483647、unsignedの場合 0~4294967295) int は システムにおける 標準 という定義です。 32ビットシステムの場合は同じになります。 DOS時代はシステムが 16ビットのため、intは -32768~+32767(または 0~65535)でした。 short int とすることで 16ビット互換となります。

devman
質問者

補足

なるほど。 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-i7-2600K-Processor-(8M-Cache-3_40-GHz) ここを見るかぎり64bitCPUなので、 intは64bit分となると思いました。 しかし、VC++ 2010コンパイラでx64としてコンパイルしても intは64bit分(8バイト分)とらず、 2147483647 2147483647 と出力されました。 なぜなのでしょうか。 64bit CPU / 64bit OSでもintは32bitが上限なのでしょうか。 今後128bit OSや128bit CPUが出てきた時もintは32bitが上限となるのでしょうか。

その他の回答 (4)

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.5

>64bit CPU / 64bit OSでもintは32bitが上限なのでしょうか。 過去、intは32bitとして扱うことが多かったので 互換性のために32bitにしてると思われます。 >今後128bit OSや128bit CPUが出てきた時もintは32bitが上限となるのでしょうか。 将来どのようになるかなんてわかりません。

devman
質問者

お礼

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

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.4

たまたま両者がそういう環境だったから。 int: 少なくとも-32767~32767の整数が扱える。 long: 少なくとも-2147483647~2147483647の整数が扱える。 扱える値の範囲が long >= int 上記の条件さえみたせばC(C99)としては問題ありませんので。 ちなみにLONG_MAXを出力するなら >printf("%d\n%d", INT_MAX, LONG_MAX); のフォーマットは不適切です。

devman
質問者

補足

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

  • tsunji
  • ベストアンサー率20% (196/958)
回答No.3

int型はコンパイラによって、ビット長が変わります。 基本的にCPUのビット数がint型のビット長となります。 16ビット以下のシステムでは、int型は暗黙の了解で16ビットとなるものが多いです。 16ビット型の整数として使いたい場合は、short型を使用してください。 int型のサイズが知りたい場合は、INT_MAXを使うか、sizeof関数を使用してください。

devman
質問者

補足

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

  • koujikuu
  • ベストアンサー率43% (429/993)
回答No.2

int は、そのCPUに適したサイズになります、8ビットのCPU なら1バイト 16ビットのCPUなら2バイト 32ビットのCPUなら4バイト 32bit の gcc なので4バイトになったと思われます。

devman
質問者

補足

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

関連するQ&A