• ベストアンサー

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型の範囲とは何を意味するのでしょうか?

noname#108554
noname#108554

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

intの範囲は環境に依存します。 Win32では、intは符号付32bitです。

noname#108554
質問者

お礼

そうでしたか。ありがとうございました。 環境と型の扱える範囲が一覧になっているようなHPはご存じないでしょうか?

その他の回答 (4)

  • furlong
  • ベストアンサー率50% (17/34)
回答No.5

doubleの範囲は<float.h>に書かれています。でも、人が読んで分かる表現で書かれているかどうかは場合によりけりです。 #include <float.h> printf ("Max double value is %e\n", DBL_MAX); printf ("Max float value is %e\n", FLT_MAX); などとやってみてください。

noname#108554
質問者

お礼

今回は甲乙つけがたいのでポイントは先着順にさせていただきます。 ありがとうございました。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

>そうか、機種依存するのは、intとunsigned intのみなので、 >わざわざLIMITS.Hのようなファイルに書く必要はないわけですね。 じゃなくて、浮動小数点は書けないんですよ。 >int型がどこまで使えるかを判定するプログラムを作らなければいけない、と。 普通はしませんが・・・ とりあえず、sizeof(int)で4だったら32bitってことで。

noname#108554
質問者

お礼

今回は甲乙つけがたいのでポイントは先着順にさせていただきます。 ありがとうございました。

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.3

>double型などはどこに書いてあるのでしょうか? double型は8バイトの浮動小数点です。 10進数だと有効桁数は15~16桁です。 それ以上の桁になると +1しても切り捨てられます。 MSDNによると 「double 型の値の範囲がおおよそ 1.7E-308 ~ 1.7E+308 になります。」 と書いてあります。

noname#108554
質問者

お礼

そうか、機種依存するのは、intとunsigned intのみなので、 わざわざLIMITS.Hのようなファイルに書く必要はないわけですね。 すると、プログラムを最初に書くときは、 int型がどこまで使えるかを判定するプログラムを作らなければいけない、と。 ありがとうございました。

  • mrumesuke
  • ベストアンサー率45% (254/557)
回答No.2

LIMITS.Hでは #define INT_MAX 2147483647 /* maximum (signed) int value */ と定義されています。

noname#108554
質問者

お礼

なるほどこのファイルに書いてあると。 double型などはどこに書いてあるのでしょうか? 探してみましたが、なさそうなんですが・・・

関連するQ&A

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

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

    ---------------------------------------------------------------------------------------- #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); }

  • クイックソート

    #include<stdio.h> #include<stdlib.h> #define MAX 10 int comp(const void *i,const void *j); int main(void) { int sort[MAX], i ; for(i=0 ; i<MAX ; i++){ sort[i] = rand(); } qsort(sort, MAX, sizeof(int), comp); for( i=0; i<MAX ; i++) printf("%d\n", sort[i]); return 0; } int comp (const void *i, const void *j) { return *(int*)i - *(int*)j; } これはクイックソートのプログラムなのですが、 int comp (const void *i, const void *j) { return *(int*)i - *(int*)j; } この部分がわかりません。ここでソートしているのですか?

  • 引数のみで出力

    問題として main内部を変更してはならない。 関数sub()でmainのループと同じ出力するようにせよ。 ただし、関数subで引数以外の変数を宣言してはならない。 また、広域変数を追加してはならない。 となっていて、色々とforループで出力させようと 配列にしたりポインタにしたりしたのですが forのiに比例する配列をどう組めばいいのか、わからないです。。。 mainの出力は 1 8 15 22 29 36 となっています。 これをsubでもできるように設定するみたいです。 #include <stdio.h> #define MAX 7 void sub(int [MAX]); int main() { int i; int x[MAX]; for (i = 0; i < MAX-1; ++i) { x[i] = 7*i+1; } x[MAX-1] = 0; for (i = 0; x[i] > 0; ++i) { printf("x = %d\n", x[i]); } printf("print again\n"); sub(x); return 0; } void sub(int a[MAX]) { // a[6]=0 // MAX 7 a[MAX-1]=0; for(a[MAX-1];a[MAX-7]<=MAX-1;++a[MAX-1]){ //a[MAX-1] = 7*a[MAX-1]+1; printf("a[%d] = %d\n",a[MAX-1],a[MAX-7]); } }

  • コンパイルエラー

    このソースを実行しても、コンパイルエラーになります。エラーメッセージは、 エラーE2449で19行目で、'eng'のサイズが不明またはゼロとでます。これが、二つ出ます。また20行目の'mat'も一緒のが二つでます、ほかにもでるのですが、これが、分からないので教えてください。宜しくお願いします。また、int max= vc[0];の意味も教えてください。 #include <stdio.h> #define NUMBER int max_of(int vc[ ],int no) { int i; int max = vc[0]; for (i=1; i< no; i++) if(vc[i] > max) max= vc[i]; return(max); } int main(void) { int i; int eng[NUMBER]; /*数学の点数*/ int mat[NUMBER]; /*英語の点数*/ int max_e, max_m; /*最高点*/ printf("%d人の点数を入力してください。\n", NUMBER); for (i=0; i<NUMBER; i++) { printf("[%d] 英語 :",i+1); scanf("%d", &eng[i]); printf(" 数学 :"); scanf("%d", &mat[i]); } max_e = max_of(eng, NUMBER); /*英語の最高点*/ max_m = max_of(mat, NUMBER); /*数学の最高点*/ printf("英語の最高点=%d\n", max_e); printf("数学の最高点=%d\n", max_m); return (0); }

  • C言語の実行について、

    #include <stdio.h> #define N 2 void main(void) { int i ,j ; for( i=1 ; i <= N ; ++i) { for( j=i ; j < N+2 ; ++j) { printf("j=%d\n",j); } printf("i=%d\n",i); } } を実行すると、 j=1,j=2,j=3,i=1,j=2,j=3,i=2となったんですが、 どういった順序で行われているのでしょうか? よろしくお願いします。

  • Cの素人がやってしまう・・・と言われた使い方

    関数set()を作って、下にコメントアウトされているプログラム と全く同じ動作をするプログラムを完成させよ。 main内部を変更してはならない。 関数set()内では鈎括弧を使用してはならない。 という問題で、終わるときにチェックされたのですが どうもsetでの中身が素人がよくやるやつ、といわれました。 int x[MAX]とやれ?ということなのでしょうか それともやはり&(*(x+i))の部分がおかしいということでしょうか? 確かにアドレスにアドレスを聞いているような理解としか、今は言いようがないのですが そいえば前回&*を使ってる人がいるけど・・・という話を聞きました 何かご指摘あればうれしいです 以下がコードになります。 #include <stdio.h> #define MAX 10 void set(int *x); int main() { int x[MAX]; int j; set(x); printf("KEKKA\n"); for (j = 0; j < MAX; ++j) { printf("%d\n", x[j]); } return 0; } void set(int *x) { int i; for(i = 0; i < MAX; ++i){ scanf("%d",&(*(x+i))); } } /* int main() { int x[MAX]; int j; for (j = 0; j < MAX; ++j) { scanf("%d", &x[j]); } printf("KEKKA\n"); for (j = 0; j < MAX; ++j) { printf("%d\n", x[j]); } return 0; } */

  • プログラミング 配列 合計

    配列の要素に値を読み込んで表示させるプログラムは 1#include <stdio.h> 2 3int main(void) 4{ 5 6 int i; 7 int vc[5]; 8 9 for (i = 0; i < 5; i++) 10 vc[i] =i + 1; 11 12 for(i = 0; i < 5; i++) 13 printf("vc[%d] = %d\n", i, vc[i]); 14 15 return (0); }でこれを書きなおして配列の値を合計するプログラムはどういうプログラムになるか教えていただけませんか?

  • ポインターを使った並べ替え

    ポインタを用いてソートを行うプログラムを作成しています しかし、関数部分が悪いのか、上手く作動されません よろしければ、アドバイスをいただけると嬉しいです #include <stdio.h> #define MAX 10 #define RandMax 1000 void select_sort(int *a, int n){ int *i, *min, *last, t; last=a+n; for(i=a; i<last; i++){ min=a; for(i=a+1; i<last; i++) if(*i<*min) min=i; t=*min; *min=*i; *i=t; } } main(){ int *a, i; a=(int*)calloc(MAX,sizeof(int)); for(i=0; i<MAX; i++) a[i]=rand()%RandMax; select_sort(a, MAX); printf("data size=%d \n", MAX); for(i=0; i<MAX; i++){ printf("%5d", a[i]); if(i%10==9) printf("\n"); } } 以上が私の作成したプログラムです よろしくお願いします

  • define で 配列

    #defineで配列を定義したいのですがこのようなことは可能でしょうか? ヘッダファイル(test.h)で #define MAX (2) int A[MAX]={20,30}; ソースファイルで #include <stdio.h> #include "test.h" int main(){ int i; for(i=0;i<MAX;i++){ printf("A[%d]=%d\n",i,A[i]); } return 0; } とやれば出来るのですが、このヘッダファイルを複数のソースで参照すると 多重定義であるとおこられてしまいます。 #defineで #define A[MAX] {20,30} のように配列を定義する方法は存在するのでしょうか? どなたか良い方法を御存じの方、ご教授お願いします。

専門家に質問してみよう