64ビットCPUでのプログラミングについて

このQ&Aのポイント
  • 64ビットCPUでのプログラミングについて
  • 64ビットのCPUなのになぜアドレスのサイズやintのサイズは32のままなのでしょうか?
  • 詳しい方、どうか教えてください。
回答を見る
  • ベストアンサー

64ビットCPUでのプログラミングについて

64ビットCPUでのプログラミングについて 以下のようなプログラムを実行するとします int a; printf ("%d ", sizeof (&a)); printf ("%d ", sizeof (a)); 僕の期待としては 8 8 という出力結果を期待したのですが、 実際に実行してみると 4 4 となりました。 64ビットのCPUなのになぜアドレスのサイズやintのサイズは32のままなのでしょうか? 詳しい方、どうか教えてください。 ちなみに、実行環境は intel core i5, windows 7, visual studio 2005 です。 よろしくお願いします。

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

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.5

CPUとかOSは関係ないです 32ビットOSでも64ビット用のプログラムはコンパイルできます 64ビットOSでも32ビット用のプログラムをコンパイルできます コンパイラーが対応していればですが VisualStudioですとターゲットはデフォルトで32ビットになってたと思います x64にすると64ビット用にコンパイルします

sorokuku
質問者

お礼

どうもWin32以外に変更できません。。 変更方法を調べてみます! ありがとうございました。

その他の回答 (6)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.7

VisualStudioのインストール時にすべて「OK」を選んでると64ビット版はインストールされなかったような気がします。 もう一度DVDからインストールして64ビット版もインストールしてください。

sorokuku
質問者

お礼

ありがとうございます。 おそらくその線の可能性が高いと思います。 DVDを探して、再度インストールを試みてみようと思います。

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.6

> どうもWin32以外に変更できません。。 もしかして、Visual StudioのExpress Editionを使っているのではありませんか? http://www.microsoft.com/japan/msdn/howtobuy/vs2005/editions/stdexp/の機能比較の表を見ると分かるように、Express Editionでは64ビット版アプリケーションを作ることができません。

sorokuku
質問者

お礼

回答ありがとうございます。 機能比較を参照すると僕の持っているエディションでは64ビット開発可能なようです。 もう少し、調べてみます。

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.4

ポインタのsizeofが8にならないのは、そのプログラムを64ビット版としてコンパイルしていないからではないでしょうか。 一方、64ビット環境でもsizeof(int)は4のままです。WindowsのデータモデルはLLP64なので。 http://ja.wikipedia.org/wiki/64%E3%83%93%E3%83%83%E3%83%88 の下のほうの「64ビットデータモデル」の表を参照してください。

sorokuku
質問者

お礼

> ポインタのsizeofが8にならないのは、そのプログラムを64ビット版としてコンパイルしていないからではないでしょうか。 そのような気がします。確認してみます。 intは32ビットのままですね。 参考リンクありがとうございます。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

Viual Studioのプロジェクトのプロパティで64bitでコンパイルするように設定しないと、64bitにはならないと思います。 また、intはchar<=short<=int<=longになっていればよく、32bitCPUで32bit、64bitCPUで64bit、というのも一概には言えないようです。

sorokuku
質問者

お礼

なるほど! 早速プロパティの設定をいじって実験してみます

noname#112604
noname#112604
回答No.2

64ビットCPUっていっても、 「64ビットまで使えますよ~~」 って意味ですので、 「64ビットにします~~」 って命令(設定)しないといけません。 OSは64bit版OSを使わないといけません。 あなたのお使いのPCは32bit版なので買い替え(2万前後)が必要です。

sorokuku
質問者

補足

コンピュータのアイコンを右クリックし プロパティを開いてスペックを確認すると 64bitオペレーションシステム との記載があるのですが、 これは64bit版OSを使用していることにはならないのでしょうか?

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.1

OSも入れ替えたの? 32ビット版の答えみたいですけど。

sorokuku
質問者

補足

OSは入れ替えていません。 3か月くらい前に、新品で購入したパソコンで実行しています。

関連するQ&A

  • プログラミングについて教えてほしいんですが・・・

    プログラミングについて教えてほしいんですが・・・ プログラミングで四則演算プログラムをやっているのですが余りの求め方がわかりません。足し算の求め方は /*lesson2.c*/ #include<stdio.h> int add(int,int); int main(){ int a,b,c; printf("a="); scanf("%d",&a); printf("b="); scanf("%d",&b); c=add(a,b); printf("a+b=%d\n",c); } int add(int x, int y){ return x+y; } というやり方で求めることができたのですが、余りは上のプログラムのどこを変えたらいいのでしょうか? 誰かわかる人がいたら教えてください。お願いします。

  • ポインタ変数のサイズ

     いろいろC言語のことを知りたくて、次のソースを作って動かしてみました。 ★ソース(□はタブ) ◆◆◆◆◆ #include <stdio.h> #include <stdlib.h> int main(void) { □char *s1; □int *s2; □ □s1 = (char *)malloc(1000); □s2 = (int *)malloc(1000); □ □printf("sizeof s1 = %d\n", sizeof s1); □printf("sizeof s2 = %d\n", sizeof s2); □ □printf("sizeof *s1 = %d\n", sizeof *s1); □printf("sizeof *s2 = %d\n", sizeof *s2); □ □printf("s1 = %d\n", s1); □printf("s2 = %d\n", s2); □ □printf("*s1 = %d\n", *s1); □printf("*s2 = %d\n", *s2); □ □return EXIT_SUCCESS; } ◆◆◆◆◆ ★実行結果1 ◆◆◆◆◆ sizeof s1 = 4 sizeof s2 = 4 sizeof *s1 = 1 sizeof *s2 = 4 s1 = 1323000 s2 = 1324008 *s1 = -60 *s2 = 1310916 ◆◆◆◆◆ ★実行結果2 ◆◆◆◆◆ sizeof s1 = 4 sizeof s2 = 4 sizeof *s1 = 1 sizeof *s2 = 4 s1 = 11087864 s2 = 11088872 *s1 = -60 *s2 = 11075780 ◆◆◆◆◆ ★実行結果3 ◆◆◆◆◆ sizeof s1 = 4 sizeof s2 = 4 sizeof *s1 = 1 sizeof *s2 = 4 s1 = 1519608 s2 = 1520616 *s1 = -60 *s2 = 1507524 ◆◆◆◆◆  OSはWindows Vista、コンパイラはMS Visual Studio 2010 コマンドプロンプトです。次の疑問についてご教授頂きたく、お願い致します。 (1)“sizeof s1”、“sizeof s2”の値が共に4となるのはなぜか。  char型へのポインタ、int型へのポインタとして宣言したs1、s2のサイズが同じ4になる理由が、どうしても分かりません。 (動かす前の予想は、でたらめな値になるかと思っていましたが) (2)“s1”、“s2”、“*s2”の値が毎回でたらめな値になったのに対して、“*s1”の値が毎回“-60”になったのはなぜか。  ポインタでつまずいており、いろいろ実験して体で理解したいと思っています。どうぞよしくお願い致します。

  • 学校の授業でC言語をやっているので「猫でも分かるC言語プログラミング」

    学校の授業でC言語をやっているので「猫でも分かるC言語プログラミング」を買ったのですが、 下記のソースを実行しようとしても「'a' :仮パラメーター リスト内にありません」とエラーが出てしまいます。 プログラミングに関してはど素人なので何をどうすればいいのかまったく分かりません。もしよければ誰か助けてください! ちなみにMicrosoft visual C++ 2010を使っています #include <stdio.h> int main() {     int a, b, c; a = 10; b = 15; c = a + b; printf("%dたす%dは%dです\n", a, b, c); return 0; }

  • プログラミング教えてください!!!お願いします。

    プログラミング教えてください!!!お願いします。 次の文が実行されると何がどのようにプリントされるか。何もプリントされない時は「なし」と記せ。 また、途中に「ブランク」が入る場合は、”b”と記せ。 (1) int func1(), func2(); int data = 100; main() { int w = 1; static x =10; printf("** %d, %d, %d\n" ,w,x,data); func1(); printf("** %d, %d, %d\n" ,w,x,data); } int func1(){ int w = 2; static int x = 20: printf("*** %d, %d, %d\n", w, x, data); x += 10; func2(); printf("*** %d, %d, %d\n" , w,x,data); x *= 2; data = data - x; } int func2() { int w = 3; static int x = 30; printf("**** %d, %d, %d\n" ,w,x,data); data -= x; } (2) int func1(char *, char *, char *); int func2(char *, char *, char *); main() { char sta[20], stb[20], stc[20], std[20]; int i=0; func1("abc","xyz",sta); printf("%d -- %s\n" ,++i,sta); func1("123","456",stb); printf("%d -- %s\n" ,++i,stb); func1(sta,stb,stc); printf("%d -- %s\n" ,++i,stc); func2(sta,stb,std); printf("%d -- %s\n" ,++i,std); } int func1(char *a, char *b, char *c){ while(*a) *c++ = *a++; while(*b) *c++ = *b++; * c = 0x00; } int func2(char *a, char *b, char *c){ int i = 0; while(*b){ if(i%2 == 0) *c++ = *a++; else *c++ = *b++; i++; } *c = 0x00; }

  • プログラミング

    プログラミング初心者なのですが、次のソースについて説明お願いします。 #include<stdio.h> int main(void) { int a[3]; int i; for(i = 0; i <= 2; i++) { a[i] = i + 1; printf("a[%d] = %d\n", i a[i]); } return 0; } for文でiに0を代入して繰り返す条件を仮定したあとの a[i] = i + 1; とprintfの中の仕組みがよくわかりません・・・。 お願いします<(_ _)>

  • プログラミングの課題です。

    プログラミングの課題です。 9個のマスがあり、1~9の数字が一個だけ入るとする。 このとき、符号なし整数1つでマスにまだ入れられていない数字を記録したい。 そこで、下位ビットから9ビット目までで1~9がマスに入っているかどうかを表すこととする。 空白のマスは0で表示する。 例:132584090→下位9ビット:001100000 この場合、6もしくは7がマスに入っていないため、6ビット目と7ビット目に1が立っていることとなる。 課題プログラムを実行すると、in.txtから9個の文字データを読み込み、上記のような変換をして9ビットのデータのビット列を表示する。例えば132584090とin.txtに記録されていた場合、下位9ビットは001100000と表示される。 手順 1..ビット列を記録する変数を宣言し、0で初期化する。 2..9個の数字を9個の変数に ファイルから読み込む 3..各変数には0~9の数字が入っているが、0以外の場合に対応する桁に1を立てる 4..ビット列の 0と1を反転させる 5..下位9ビットをprintf関数で表示する 6..in.txtの値をいろいろ変化させて、プログラムが正しいことを確認せよ。 #include <stdio.h> int main() { int i,a[10],b; FILE *fp; fp=fopen("in.txt","r"); if(fp==NULL){ printf("ファイルが開けませんでした\n"); } while(fscanf(fp,"%d %d %d %d %d %d %d %d %d",a[i],a[i],a[i],a[i],a[i],a[i],a[i],a[i],a[i]))i++; for(i=0;i<9;i++){ a[i]='\0'; } for(i=0;i<9;i++){ a[i]=b; } b=~b; printf("下位9ビット",(b%256)&8,(b%128)&7,(b%64)&6,(b%32)&5,(b%16)&4,(b%8)&3,(b%4)&2,(b%2)&1,b%1); return(0); } こんな感じで作りましたが、実行できませんでした。できれば詳しく解説していただけるとたすかります。よろしくお願いします。

  • VC++ windows 64ビットプログラミング

    VC++でのwindows 64ビットプログラミングを勉強しています。 以下のMSDNのページにたどり着き、サンプルプログラムを作りながら確かめているのですが、 http://msdn.microsoft.com/ja-jp/library/3b2e7499.aspx 以下の記述の意味がよく分からないので、教えてください。 ---ここから--- int と long は、64 ビット Windows オペレーティング システムでは 32 ビット値です。 64 ビット プラットフォーム用にコンパイルする必要があるプログラムでは、ポインターを 32 ビット変数に割り当てないように注意してください。 ポインターは、64 ビットのプラットフォームでは 64 ビットなので、ポインターを 32 ビット変数に割り当てると、ポインター値を切り捨てることになります。 ---ここまで--- intとlongのサイズが4バイトでこれは32ビットのときと変わらず、 ポインタのサイズが8バイトに拡張された(これはメモリアドレスが64ビットになったのだから当然)のは理解しているのですが、 http://msdn.microsoft.com/ja-jp/library/94z15h2c.aspx 「ポインターを 32 ビット変数に割り当てる」というのがどういうこと(どういうコード)なのかがわかりません。 こんなことかなとも思ったのですが、これはありえない記述ですよね =============== int a = 0; int *pt = NULL; a = pt; //32ビット変数にポインタを割り当て???(というよりポインタを代入か) error C2440: '=' : 'int *' から 'int' に変換できません。 1> この変換が可能なコンテキストはありません。 =============== 32ビットでは問題にならなくて、64ビットになったから問題になって、どう変えれば問題なくなるのか という感じで説明していただけると分かりやすいのかな思います。 よろしくお願いします。

  • C++ プログラミング

    連立方程式の逆行列と解を出そうとしたのですが /*n=4と定義nは元の数*/ #define n 4 int main() { /*係数マトリクスAと単位マトリクスと右辺ベクトルの定義*/ double a[n][n+5]={{4,1,3,2,1,0,0,0,23}, {1,4,3,3,0,1,0,0,30}, {5,5,10,5,0,0,1,0,65}, {4,4,2,6,0,0,0,1,42}}; double x,y; int i,j,k; /*#1ピボットの演算を行うためのループ*/ for(k=0;k<n;k++) { /*ピボット係数*/ x=a[k][k]; /*#2ピボットをにするための演算を行うためのループ*/ for(j=k;j<n+5;j++) /*ピボット行をxで割る*/ a[k][j]=a[k][j]/x; /*#3ピボット列の掃き出しを行うためのループ*/ for(i=0;i<n;i++) { /*#4iがkではないとき*/ if(i!=k) { y=a[i][k]; /*#5ピボット以外をにする演算を行うためのループ*/ for(j=k;j<n+5;j++) a[i][j]=a[i][j]-y*a[k][j]; } } } /*結果を表示*/ printf("係数マトリクスAの逆行列を表示\n"); for(i=0;i<n;i++){ for(j=4;j<n+4;j++){ printf("a[%d][%d]=%f",i+1,j-3,a[i][j]); } printf("\n"); } printf("連立方程式の解を表示\n"); for(i=0;i<n;i++) printf("x%d=%f\n",i+1,a[i][n+4]); return 0; このプログラムを打って 1>z:\win\personal\visual studio 2008\projects\課題2.cpp(35) : error C3861: 'printf': 識別子が見つかりませんでした 1>z:\win\personal\visual studio 2008\projects\課題2.cpp(38) : error C3861: 'printf': 識別子が見つかりませんでした 1>z:\win\personal\visual studio 2008\projects\課題2.cpp(40) : error C3861: 'printf': 識別子が見つかりませんでした 1>z:\win\personal\visual studio 2008\projects\課題2.cpp(42) : error C3861: 'printf': 識別子が見つかりませんでした 1>z:\win\personal\visual studio 2008\projects\課題2.cpp(44) : error C3861: 'printf': 識別子が見つかりませんでした 1>z:\win\personal\visual studio 2008\projects\課題2.cpp(46) : fatal error C1075: 左側 中かっこ '{' に対応するものが 'z:\win\personal\visual studio 2008\projects\課題2.cpp(4)' で見つかる前に EOF が検出されました。 とエラーがでました.printfはちゃんと定義されてると思うんですが何がおかしいのでしょうか・・・?

  • お願いします!!!プログラミングについて。

    お願いします!!!プログラミングについて。 次の文が実行されると何がどのようにプリントされるか。何もプリントされない時は「なし」と記せ。 また、途中に「ブランク」が入る場合は、”b”と記せ。 (1) printf("i=%d j=%lf\n", 1/2,1/3); (2) x = 0.5; y= 1e0/3e0; printf("x = %7.3f, y = %12.5e\n", x, y); */ (3) i = 2; j = 3; printf("%d", i==2); (4) int sum1(i){ int s = 0; return s += i; } int sum2(i){ static int s = 0; return s += i; } main(){ int s1, s2, i; for(i=1;i<=10;i++){ s1 =sum1(i); s2 = sum2(i);} printf("%d %d\n",s1,s2); } (5) int mtx[4][3] = {{1,2,3},{4,5,6},{7,8,9},{-1,-2,-3}}; int i,j,rtot,ctot[3]={0,0,0},stot=0; for(i=0,i<4,i++){ rtot = 0; for(j=0;j<3;j++){ rtot += mtx[i][j] ctot[j] += mtx[i][j]; stot += mtx[i][j]; printf("%3d ",mtx[i][j]); } printf(" %3d\n",rtot); } printf("\n"); for(j=0;j<3;j++) printf("%3d ",ctot[j]); printf(" %3d\n",rtot); この5問をプログラミングに詳しい方教えてください!切実です。。 一つだけでも構いません!よろしくお願いします。

  • お願いします!!!プログラミングについて。

    お願いします!!!プログラミングについて。 次の文が実行されると何がどのようにプリントされるか。何もプリントされない時は「なし」と記せ。 また、途中に「ブランク」が入る場合は、”b”と記せ。 (1) printf("i=%d j=%lf\n", 1/2,1/3); (2) x = 0.5; y= 1e0/3e0; printf("x = %7.3f, y = %12.5e\n", x, y); */ (3) i = 2; j = 3; printf("%d", i==2); (4) int sum1(i){ int s = 0; return s += i; } int sum2(i){ static int s = 0; return s += i; } main(){ int s1, s2, i; for(i=1;i<=10;i++){ s1 =sum1(i); s2 = sum2(i);} printf("%d %d\n",s1,s2); } (5) int mtx[4][3] = {{1,2,3},{4,5,6},{7,8,9},{-1,-2,-3}}; int i,j,rtot,ctot[3]={0,0,0},stot=0; for(i=0,i<4,i++){ rtot = 0; for(j=0;j<3;j++){ rtot += mtx[i][j] ctot[j] += mtx[i][j]; stot += mtx[i][j]; printf("%3d ",mtx[i][j]); } printf(" %3d\n",rtot); } printf("\n"); for(j=0;j<3;j++) printf("%3d ",ctot[j]); printf(" %3d\n",rtot); この5問をプログラミングに詳しい方教えてください!切実です。。1問だけでも構いませんのでよろしくお願いします。

専門家に質問してみよう