• ベストアンサー

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% (1619/5652)
回答No.5

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

devman
質問者

お礼

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

  • wormhole
  • ベストアンサー率28% (1619/5652)
回答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% (428/992)
回答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

  • int型の表せる範囲

    VC++6.0 on win2kです。 int型の表せる範囲は3万ぐらいまでだと思っていたのですが、 #include <stdio.h> #define Max 1000000 void main(){ for(int i=0;i<Max;i++){ printf("%d\n",i); } } というプログラムを走らせると普通に出ます。 int型の範囲とは何を意味するのでしょうか?

  • なぜgccはstdio.hをインクルードしなくてもprintfが実行できるのか

    なぜgccはstdio.hをインクルードしなくてもprintfが実行できるのでしょうか。 暗黙にインクルードされるヘッダと されないヘッダファイルの差分等あれば教えていただきたく。。 // main.c int main(){ printf("SWSW\n") ; return 0 ; } % gcc main.c % ./a.out SWSW

  • int型とchar型について

    C言語初心者です。 よろしくお願いします。 ◎1----------------------- #include<stdio.h> int main(void) { int ss[4]="789"; printf("%c\n",ss[0]); return 0; } --------------------------- ◎2----------------------- #include<stdio.h> int main(void) { int *p; p="789"; printf("%c\n",*p); return 0; } --------------------------- ◎1、◎2の2つのプログラムについて疑問があります。 ◎1の「int ss[4]="789";」と◎2の「int *p;」のintの部分は今まで、何の疑問も抱かず、「char」として入力していました。 そこでchar型は1バイトの整数、int型は4バイトの整数ということで容量が違うだけで、intとしても大丈夫だろうと思ったのですが、 ◎1では、「'initializing' : 'char [4]' から 'int [4]' に変換することはできません。」とエラーが出て、◎2では「'char [4]' から 'int *' に変換することはできません。」とエラーが出ます。 intは文字列は扱えないということなのでしょうか? 以上intだと実行できない理由がわかりません。 初歩的なことですいませんが、教えていただけると嬉しいです。

  • プログラミング 配列

    配列の各要素に先頭から順に1,2,3,4,5を代入して表示という指示なのですが #include <stdio.h> #include <stdio.h> int main(void) { int vc[5]; vc[0] = 1; vc[1] = 2; vc[2] = 3; vc[3] = 4; vc[4] = 5; printf("vc[0] = %d\n", vc[0]); printf("vc[1] = %d\n", vc[1]); printf("vc[2] = %d\n", vc[2]); printf("vc[3] = %d\n", vc[3]); printf("vc[4] = %d\n", vc[4]); return (0); }で実行したら vc[0] = 2 vc[1] = 3 vc[2] = 4 vc[3] = 5 vc[4] = 5 っていうに出てしまったのですが、上の文の何が間違っていたんでしょうか? 本来なら vc[0] = 1 vc[1] = 2 vc[2] = 3 vc[3] = 4 vc[4] = 5 と表示されるはずなんですが・・

  • int とcharの使い方と違い

    教えてgooに投稿するのは初めてですがよろしくお願いします。 最近C言語を勉強し始めた初心者です。 ネットのサイトを見て独学でしています。 過去スレッドをさらっと見て聞きたいことが書いてなかったので投稿します。(同じスレッドがあったらすみませんOTL) #include<stdio.h> int main(void) { int str='a'; printf("str=%c\n",str); return0; } この上のプログラムでは str=a と出て、エラーが出ずにコンパイル出来ました。でも、 #include<stdio.h> int main(void) { int str[]="abc"; printf("str=%s\n",str); return0; } とするとエラーが出ます。 int とcharの使い方と違いについて詳しく教えてほしいです>< お願いします。

  • 何処が間違っていますか?

    ---------------------------------------------------------------------------------------- #include<stdio.h> #include<stdlib.h> #define MAX_LINE 128 int main(void); int main(void) { char buf[MAX_LINE]; int n; printf("降水確率を入力してください。\n"); gets(buf); n = atoi(buf); printf("降水確率は %d %% です。\n",n); if (n >= 50) { printf("傘を忘れずにね。\n"); } else { printf(傘はいりません。\n"); } printf("いってらっしゃい。\n"); return(0); }

  •  現在、私はC言語を学んでいます。

     現在、私はC言語を学んでいます。  プログラミングの初期の初期の問題なんですが、 「Hello World」という有名なプログラムがありますよね? それについての質問です。 #include<stdio.h> main() { printf("Hello World"); return 0; } も #include<stdio.h> main(void) { printf("Hello World"); return 0; } も #include<stdio.h> int main() { printf("Hello World"); } もちゃんと表示できます。 ここで質問です。 int main(void) int main() main() main(void) はどう違うんですか? あと、 return 0; はあっても無くてもいいようなんですが どういう意味があるんでしょうか?

  • RAND_MAXの最大値について

    /* YouTubeのC入門系動画に乱数の話があり真似てみたところ、動画では2147483647まで出力されているのですが、 私の環境では32767までしか出力されません。 この最大値の違いは、どうして出るのでしょうか? また、私の環境で最大値2147483647まで出せるようになりますか?または、出せる方法があるなら教えてください。 よろしくお願いします。 */ cpu i5 3570 memory 32GB OS Windows 10 pro 64bit Microsoft Visual Studio Community 2015 */ #include <stdio.h> #include <stdlib.h> int main(void) { printf("MAX : %d\n", RAND_MAX); return 0; }

  • オーバーフローを繰り返したときの挙動

    #include <stdio.h> int function(int x){ if(x==1) return 1; else return x*function(x-1); } int main(){ int x; x = function(50); printf("%d\n",x); } 50!を計算するプログラムを作成し、VC++とgccでそれぞれコンパイルして実行したところ結果は0と表示されました。 途中でオーバーフローしているのは分かるのですが、数回オーバーフローを繰り返した後にfunctionの戻り値が-2^31に収束し、最終的に0になります。 何故このような挙動をするのでしょうか?

  • pow

    「1~10までの数、 その2乗、 その3乗」を10行出力するものです。 なぜか5^2 = 24 なってしまいました。なぜですか。お願いします。 #include <stdio.h> #include <math.h> int main(void) { int i, j; for (i = 0; i < 10; i++) { for (j = 0; j < 3; j++) { printf("%4d ", (int)pow(i+1, j+1)); } printf("\n"); } return 0; }