Windows 64ビット OS での依頼

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
cuser

Windows 64ビット OS での依頼

#1

投稿記事 by cuser » 9年前

私は 32ビット OS しか持っていないので 64ビット OS を持っている人に試してもらいたいことがあります。
次のやつです。

コード:

printf("sizeof(char *) = %d, sizeof(int) = %d\n", sizeof(char *), sizeof(int));
ちなみに私のところでは次のようになりました。
Windows 7 Home Premium 32 ビット OS

 Borland C++ 5.5.1 for Win32
  ⇒ sizeof(char *) = 4, sizeof(int) = 4

 Embarcadero C++ 7.20 for Win32
  ⇒ sizeof(char *) = 4, sizeof(int) = 4

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: Windows 64ビット OS での依頼

#2

投稿記事 by みけCAT » 9年前

cuser さんが書きました:

コード:

printf("sizeof(char *) = %d, sizeof(int) = %d\n", sizeof(char *), sizeof(int));
まず前提として、このコードはprintfに渡す書式指定文字列とデータが合っていないので、未定義動作になります。
返される値は十分小さいことが予想されるので、sizeofの結果をintにキャストしてからprintfに渡すと移植性が高い状態で改善できるでしょう。

それを承知の上で、あえてこの未定義動作を起こすコードを実行してみました。

コード:

#include <stdio.h>
int main(void) {
	printf("sizeof(char *) = %d, sizeof(int) = %d\n", sizeof(char *), sizeof(int));
	return 0;
}
環境
Windows 7 Home Premium Service Pack 1
プロセッサ: Intel(R) Core(TM) i7-4712MQ CPU @ 2.30GHz 2.30GHz
実装メモリ(RAM): 8.00GB
システムの種類: 64ビット オペレーティング システム

実行結果(出力)

g++ (GCC) 4.8.1

コード:

sizeof(char *) = 4, sizeof(int) = 4
Visual C++ 2008 Express Edition

コード:

sizeof(char *) = 4, sizeof(int) = 4
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: Windows 64ビット OS での依頼

#3

投稿記事 by YuO » 9年前

まず,オブジェクトのサイズはコンパイル時に決定します。
Win32用のバイナリをWoW64上,つまりは64bit Windowsで動かしても,sizeofの結果は変化しません。

その上で,Windows向けに関しては,
  • 16bit Windows用
    • short/int/near pointer : 2
    • long/float/far pointer : 4
    • double : 8
  • 32bit Windows用
    • short : 2
    • int/long/float/pointer : 4
    • long long/double : 8
  • 64bit Windows用
    • short : 2
    • int/long/float : 4
    • long long/double/pointer : 8
が一般的なサイズかと。
つまり,ILP32/LLP64です。
オフトピック
簡単に言うと,WindowsのデファクトであるVisual C++がこの設定であるため。

みけCATさんの書いている未定義動作の件に関しては,過去ログの
http://dixq.net/forum/viewtopic.php?f=3&t=5310
も参考にすると良いかと。

cuser

Re: Windows 64ビット OS での依頼

#4

投稿記事 by cuser » 9年前

お2人ともどうもありがとうございます。
お2人のコメントを呼んで、こちらの依頼内容が明確ではなかったんだと思いました。
YuO さんが書きました:まず,オブジェクトのサイズはコンパイル時に決定します。
Win32用のバイナリをWoW64上,つまりは64bit Windowsで動かしても,sizeofの結果は変化しません。
から、依頼の文面は
「先のコードの Win64ビット用のバイナリを Win64ビット OS で実行してもらい」
としなければいけなかったんだとわかりました。
みけCATさん、Win32ビット用のバイナリで実行されたのなら意図しないものでした。
わざわざ実施してもらったのに申し訳ないです。
しかし、ILP32 とか LLP64 という単語(?)が出てきたので、そこから知りたかったことにたどり着けました。
オフトピック
(もしかするとまるっきり関係ない話ではないかも...)

sizeof() に関してですが、
みけCAT さんが書きました:まず前提として、このコードはprintfに渡す書式指定文字列とデータが合っていないので、未定義動作になります。
返される値は十分小さいことが予想されるので、sizeofの結果をintにキャストしてからprintfに渡すと移植性が高い状態で改善できるでしょう。
から、「そういえば、sizeof() を知りたてのころは次のようにしてたな」と思い出しました。

コード:

printf("%u\n", sizeof(int));
でも、「返される値は十分小さいことが予想される」なら "%d" でもいいのではないでしょうか?
そこから、YuOさんに紹介された sizeofの評価結果の出力書式に%dを使っている人はどれぐらいいますか? を読みました。"%d", "%u" の違いだけが問題はではないんですね。

改めて、
みけCAT さんが書きました:返される値は十分小さいことが予想されるので、sizeofの結果をintにキャストしてからprintfに渡すと移植性が高い状態で改善できるでしょう。
なるほど。

閉鎖

“C言語何でも質問掲示板” へ戻る