• ベストアンサー

C言語とC++の相違点?

printf("sizeof(int)= %u\n", (unsigned)sizeof(int)); printf("sizeof(unsigned)= %u\n", (unsigned)sizeof(unsigned)); の結果がVisual C++では共に4なのですが、C言語の扱っている本では 共に2になっています。 これが単なるミスプリなのか、C++とC言語の違いなのか教えていただけますか? 回答よろしくお願いします。

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

  • ベストアンサー
  • BLK314
  • ベストアンサー率55% (84/152)
回答No.3

CとC++という言語の違いではありません。 16ビット/32ビットの違いです。 C言語もC++言語も整数型についての厳密な規定がありません。 唯一規定されていることは longがshort以上であること だけです。 intについてはCPUが自然に処理できるサイズを割り当てることになっています。 CPUの進歩に伴い intも16ビットから32ビットに変化してきました。 おそらく”C言語の扱っている本”は16ビットの時代に書かれたものでしょう その時代には int(unsignedも同じ)16ビット=2バイトが割り当てられていましたので sizeof (unsigned)は2を戻していたのです。 現代のVC++は32ビットなので sizeof (int) は4を戻します。 VC++も初期のころ(ver 1.5とか)の時代は16ビットでした。 ですから VC++ 1.5ではsizeof (unsigned)は2を戻します。 ちなみに 現代は32ビット ==> 64ビットへの移行期にあります。 64ビットのコンパイルをするとき sizeof (int *) は どのコンパイラでも8を戻します。 つまりポインタは64ビットになります。 しかし、sizeof (int)はどうなるかは コンパイラにより対応が分かれています。 VC++の場合は (64ビット時でも) sizeof (int)は4のままです。 しかしコンパイラによっては (主にUNIX系に多い) intも64ビットに拡張されたものもあります この場合 sizeof (unsigned)は8を戻します。 VC++も将来は(いつになるかはわかりませんが) intも63ビットになるのではないかと思います。 つまり sizeof (int)などは永久不変ではなく、 時代とともに変わるということです

参考URL:
http://ja.wikipedia.org/wiki/64%E3%83%93%E3%83%83%E3%83%88
-red13-
質問者

お礼

皆様、回答ありがとうございました。 自分はPCの知識がなく基礎から勉強している者ですので、上記の質問のように勘違いしてしました。 また、自分が学んでるC言語の本は柴田望洋さんの入門編で、(本が)新しくわかりやすいのですが柴田さんが扱っているPCが古いということがこの回答をみて分かりました。 今後ともよろしくおねがいします。

その他の回答 (5)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.6

C/C++では、int型は少なくとも-32767~+32767の値を表現できること、そしてshort型の表現範囲以上であり、long型の表現範囲以下であることが規定されています。unsigned型は少なくとも0~65535の符号無し整数を表現できること、そしてunsigned short型の表現範囲以上であり、unsigned long型の表現範囲以下であることが規定されています。 また、sizeof演算子というのは、そのオペランドが占有するバイト数を返します。これには、値ビットと符号ビットのほか、詰め物ビットが含まれることもあり得ます。C/C++における1バイトというのはchar型のサイズのことで、8ビット以上であると規定されています。したがって、1バイトが9ビットであったり、16ビットであったり、32ビットや64ビットでも構わないわけです。 そして、sizeof(int)が2ということは、int型が2バイトということです。char型が8ビットであればint型は16ビットですし、char型が16ビットであればint型は32ビットということになります。 > C言語の扱っている本では > 共に2になっています。 その本が何なのか分かりませんが、可能性としては4つ考えられます。 1. 古い。 2. 組込み関連の書籍で、H8やM16Cなどの8~16ビットCPUを用いて解説している。 3. 最小限規格を満たすモデル処理系を用いて解説している。 4. DSPやその他かなり特殊な処理系を扱っている。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.5

もしかしてLSI-C? 使った事は無いけど、16ビット時代のコンパイラだからintが2バイトだった気が。 もしLSI-Cならコンパイラの仕様って事で。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.4

>C言語の扱っている本 いつ発行された、何という本ですか?

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.2

ミスプリントでも、そしてCとC++の違いでもないでしょう。 それは、処理系の違いで、通常はCPUが違うためです。 CもC++も、intのサイズは処理系依存になっていて、例えばOSなどが違うとサイズが異なるのです。 Cの本は、恐らく16bit=2byteが主流の時代に書かれたのではないかと思います。 昨今のPentium等は32bit(最近では64bit以上も)が主流ですので、2にはなりません。 VCのオプションで、CとC++を選択できると思いますが、いずれにしても4になるはずです。 そして、MS-DOS時代のVCならCでもC++でも2になるわけです。

  • Werner
  • ベストアンサー率53% (395/735)
回答No.1

CであろうがC++であろうがint型のサイズは処理系依存です。 4と決まっているわけではありません。

関連するQ&A

  • c言語 型変換について

    c言語 型変換について 下記のように文字コードは、unsigned int型('B')をunsigned char 型(str[1] ) 格下げする型変換する規則を教えてください。 *質問ソースプログラム: int main(void) { char str[4]; /* 文字列を格納する配列 */ str[0] = 'A'; /* 代入 */ str[1] = 'B'; /* 代入 */ ・・・・・・ printf("size B %u\n",(unsigned)sizeof('B')); printf("size str[1] %u\n",(unsigned)sizeof(str[1])); * 実行結果 size B 4 size str[1] 1

  • ポインタがわからない

    C言語初心者です。 Int num; Int  *p=# という変数を宣言したとします。 下は「int *型」と呼び、pは「int型オブジェクトであるnumを指すポインタ」であることはわかりました。 ですが、「int型」と「int  *型」そのものの違いがわかりません。 たとえば、今読んでいるテキストに Printf(“int 型は%uバイトです。\n”,(unsigned)sizeof(int));→結果は2バイト Printf(“int *型は%uバイトです。\n”,(unsigned)sizeof(int *));→結果は4バイト 僕の環境では両方とも4バイトと結果は変わりませんでしたがテキストでは結果は上記のように変わってきてしまうようでした。これはなぜ変わってくるのでしょうか? 「int型」と「int  *型」そのものを比較した際の違いがわかりません。

  • C言語で分からない点があるのですが……

    C言語で分からない点があるのですが…… こんにちは。C言語を学んでいて、詰まったので宜しければ回答いただけると嬉しいです。 フィボナッチ数列に関するプログラミングです。 ユーザから数字を受け取ります。(第何項か) そこまでの数字を表示するというプログラムです。 n=3なら F1=1 F2=1 F3=2 という具合です。 しかし、実行した結果が添付した図の通りで、途中の項がすっ飛ばされていました。 どうすればいいんでしたっけ? 宜しければご助力ください!! #include<stdio.h> fib(int n) { if(n == 1)return(1); else{ if(n == 2) return (1); else return fib(n-1) + fib(n-2); } } main() { int n, i ; printf("INPUT number.: "); scanf("%d",&n); for(i=2; i<=n; i++){ printf("F%d = %d\n",n, fib(n)); } }

  • C言語に直して下さい

    VisualC++で円周率を求めるプログラムなのだそうですが、 自分はC言語しか使ったことがないため、よく分かりません。 Cでコンパイルできるように直していただけないでしょうか。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 21 #define K 100000 void add(unsigned long a[],unsigned long b[]) { int c = 0, tmp; for (int i = N - 1; i > -1; i--) { tmp = a[i] + b[i] + c; a[i] = tmp % K; c = tmp / K; } } void sub(unsigned long a[],unsigned long b[]) { int c = 0, x = 0; for (int i = N - 1; i > -1 ; i--) { x = c; if (a[i] < b[i] + x ) c = 1; else c = 0; a[i] = c * K + a[i] - b[i] - x; } } void div(unsigned long a[], unsigned long x) { int c=0, tmp; if (x >= K) { printf("Div Error\n"); getchar(); exit(1); return; } for (int i = 0; i < N ; i++) { tmp = (a[i] + c * K) / x; c = (a[i] + c * K) % x; a[i] = tmp; } } void clear(unsigned long a[]) { memset(a,0x00,sizeof(a)*N); } void set(unsigned long a[], unsigned long b[]) { memcpy(a,b,sizeof(a)*N); } void set(unsigned long a[], unsigned long b) { if (b<K) { clear(a); a[0]=b; } } int _tmain(int argc, _TCHAR* argv[]) { unsigned long pai[N], fn[N], gn[N], tmp1[N], tmp2[N]; int i; unsigned long n; clear(pai); clear(fn); clear(gn); clear(tmp1); clear(tmp2); set(fn, 16*5); set(gn, 4*239); for(n=0;n<40000;n++) { div(fn, 25); div(gn, 239); div(gn, 239); set(tmp1, fn); div(tmp1, 2*n+1); set(tmp2, gn); div(tmp2, 2*n+1); if (n%2==0) { add(pai, tmp1); sub(pai, tmp2); }else{ add(pai, tmp2); sub(pai, tmp1); } } for (i=0;i<N;i++) { printf("%5lu ", pai[i]); } getchar(); return 0; }

  • C言語について

    C言語の問題なのですか、作成したのですが内容がわからないです。テキストを読んでも解説が書いていないので、出来ればどなたか簡単な解説でも教えて頂けるとありがたい。 〈コード〉 #include <stdio.h> int main(void) { short point[] = {234, 819, 18, -6492, 795, 20302, 2431, 9029, 0, -28009}; // 定義と逆順に値を表示する for (int i = sizeof(point) / sizeof(point[0]) - 1; i >= 0; i--) { //sizeofで配列要素数を算出 printf("%d\n", point[i]); } return 0; }

  • C言語のコードについて

    C言語の問題なのですか、作成したのですが内容がわからないです。 コードをわかりやすく解説していただけると嬉しいです。 #include <stdio.h> void printBinary(unsigned char num) { int i ; /*①上位ビットから順に表示する*/ for(i = 7 ; i >= 0; i--) { /*②シフトとマスクを使用しています。*/ printf("%d", (num>>i) &0x01 ); } printf("\n"); } int main(void) { unsigned char num1 = 0xD2;/*11010010*/ unsigned char num2 = 0x5E;/*01011110*/ printf("0xD2 : "); printBinary(num1); printf("0x5E : "); printBinary(num2); return 0; }

  • C言語のビットシフトの質問

    C言語の右ビットシフトで、以下のプログラムの結果について、納得できずにいます。 dを右にシフトすると、上位ビットには0が入るのではないでしょうか? よろしくお願いします。 プログラム unsigned char d='0'; printf("%c\n", d); printf("%c\n", d>>5); 結果 0 『

  • c言語による2のべき乗

    右、左シフトと2のべき乗による乗除算が同じことを証明するプログラムを作っているのですがうまくいきません。 プログラムを載せるのでどこが間違っているのかご教授お願いします。 #include <stdio.h> int count_bits(unsigned x){ int count = 0; while(x){ if(x&1U) count++; x>>=1; } return(count); } int int_bits(void){ return(count_bits(~0U)); } void print_bits(unsigned x){ int i; for(i=int_bits()-1; i>=0; i--) putchar(((x>>i)&1U) ? '1' : '0'); } int main(void){ unsigned nx, no, n1, n2; printf("非負の整数を入力してください:"); scanf("%u", &nx); printf("何ビットシフトしますか?:"); scanf("%u", &no); n1=nx * (2^no); n2=nx / (2^no); printf("\n整数 = "); print_bits(nx); printf("\n左にシフトした値 = "); print_bits(nx << no); printf("\n右にシフトした値 = "); print_bits(nx >> no); printf("\n2のべき乗で乗算した値 = "); print_bits(n1); printf("\n2のべき乗で除算した値 = "); print_bits(n2); putchar('\n'); return(0); }

  • C言語 プログラミング

    C言語、プログラミングの質問です。 構造体について、 プログラムを組んでみたのですが、上手く出力されません。実行時にはエラーはないのですが、出力時に上手くいきません。どなたかどこがおかしいかわかる方、教えていただけませんでしょうか? #include <stdio.h> struct user{ char *name; char *id; int books; }; int main (void) { struct user u; printf("氏名を入力して下さい。"); scanf("%s",u.name); printf("パスワードを入力してください。"); scanf("%s",u.id); printf("年齢を入力してください。"); scanf("%d",&u.age); printf("氏名 %s\n",u.name); printf("パスワード %s\n",u.id); printf("年齢 %d\n",u.age); return 0; } よろしくお願いします。

  • C言語、エラーメッセージが紐解けません。

    いつも大変お世話になり誠にありがとうございます。 標記の件。 エラーメッセージが紐解けません。 どうかどなたかアドバイスください。 下記にコードとコンパイルエラーを書きます。        記 コード #include <stdio.h> typedef struct Car{ int num; double gas; }Car; int main(void) { printf("int型のサイズは%dバイトです。\n", sizeof(int)); printf("double型のサイズは%dバイトです。\n", sizeof(double)); printf("構造体struct Car型のサイズは%dバイトです。\n",sizeof(Car)); printf("構造体struct Car型へのポインタのサイズは%dバイトです。\n",sizeof(Car *)); return 0; } コンパイラーエラー C:\MinGW>gcc text20.c -o text20 text20.c: In function 'main': text20.c:12:11: warning: unknown escape sequence: '\221' printf("構造体struct Car型のサイズは%dバイトです。\n",sizeof(Car)); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ text20.c:13:11: warning: unknown escape sequence: '\221' printf("構造体struct Car型へのポインタのサイズは%dバイトです。\n",sizeof(Car *)); 以上です。 ご多忙中恐れ入ります。 ご回答の程宜しくお願い申し上げます。

専門家に質問してみよう