HP-UX General
1822397 メンバー
2899 オンライン
109642 解決策
新規ポスト

C言語でのdouble型への値代入動作がhpux10.20と11iv1で違う

 
TLSG01
貴重なコントリビューター

C言語でのdouble型への値代入動作がhpux10.20と11iv1で違う

OS:HPUX11.iv1 Model:C8000 と

OS:HPUX10.20 Model:B2000 で

同じC言語プログラムをコンパイル後

実行すると動作が違うので調べました。

double fa;

fa=0x80000000;

printf("fa=0x80000000; %f \n",fa);

fa=-21474833648.0;

printf("fa=-21474833648.0; %f \n",fa);

の記述をc8000とb2000でそれぞれ

Cコンパイルして実行しました。

b2000の場合

fa=0x80000000; -2147483648.000000

fa=-21474833648.0; -21474833648.000000

c8000の場合

fa=0x80000000; 2147483648.000000

fa=-21474833648.0; -21474833648.000000

のようにc8000ではプラスの値になりました。

基本としてdouble型変数へ

0x80000000を代入すること自体

あいまいな記述なので

互換性が保障されないケースなのでしょうか???

3件の返信3
cf
レギュラーアドバイザー

C言語でのdouble型への値代入動作がhpux10.20と11iv1で違う

Cコンパイルなぞ、5年ぶりなので、ずれた回答を

しそうですが、cc なのか aCC なのか、どのような

コンパイルオプションを指定されたか、まずは、

コンパイル時のコマンド列をお教えください。

型変換を32ビットで行っているか、64bitで行っているか

の違いではあると思いますが、アセンブラに出して見れば

分かるのではと思っています。

isao
頻繁なアドバイザー

C言語でのdouble型への値代入動作がhpux10.20と11iv1で違う

ANSI-Cの定数の解釈の違いでしょう。

HP-UX11.11の上で、以下の様にコンパイルすればワーニングを出してくれます。

$ cc +M0 xx.c

cc: "xx.c", line 7: ANSI migration warning 706: Large unsuffixed integer constant will be type unsigned integer in ANSI mode.

これによれば、定数は"unsigned int"と解釈されているようですね。

もし、今までのように解釈させたいのであれば、

fa=(int)0x80000000;

とすればよいでしょう。

TLSG01
貴重なコントリビューター

C言語でのdouble型への値代入動作がhpux10.20と11iv1で違う

ご指摘の通りです。

hpux11.11になってから

K&R と ANSIC が統合されたようで

hpux10.20では何事も無く曖昧でも

それなりに適切解釈されたものが

compile errorやwarnningになって

混乱しています。

顧客にもCコンパイラのメッセージを

見せている為、当方が悪いような

印象をもたれて困惑しています。