10

StevenPrataの著書「CPrimerPlus」には、型変換に関するセクションがあり、「基本的なルールは」セクションでルール1に記載されています。

K&R Cでは、現在のCではなく、floatは自動的にdoubleに変換されます。

http://www.9wy.net/onlinebook/CPrimerPlus5/ch05lev1sec5.html

誰かがbut not under current C意味を説明できますか?自動変換するバージョンと自動変換しないバージョンはありますか?

floatとdoubleを組み合わせた式があるかどうかを理解しようとしていますが、評価時にfloatをdoubleに昇格させるためにCを使用できますか?

4

5 に答える 5

13

フォーマットのバイナリ算術演算の結果を参照する必要がありfloat * floatます。以前の標準バージョンでは、そのような式のCオペランドがにプロモートされdouble、結果はdouble型になりました。

たとえば、「Cリファレンスマニュアル」からの引用です。

両方のオペランドがintまたはcharの場合、結果はintになります。両方が floatまたはdoubleの場合、結果はdoubleになります。

C89 / 90では、この動作はすでに変更されており、float * float式によってfloat結果が生成されます。

  • いずれかのオペランドの型がlongdoubleの場合、もう一方のオペランドはlongdoubleに変換されます。
  • それ以外の場合、一方のオペランドがdoubleの場合、もう一方のオペランドはdoubleに変換されます。
  • それ以外の場合、一方のオペランドがfloatの場合、もう一方のオペランドはfloatに変換されます。
于 2012-11-16T22:09:39.537 に答える
5

ルール全体を見てください:

式に現れると、とcharshortの両方が自動的に、または必要に応じてに変換されます。(がと同じサイズの場合、より大きい;その場合はに変換されます。)K&R Cでは、現在のCではなく、自動的にに変換されます。それらはより大きなタイプへの変換であるため、プロモーションと呼ばれます。signedunsignedintunsigned intshortintunsigned shortintunsigned shortunsigned intfloatdouble

整数型を考えると、たとえば算術式に現れる場合でも、それらは昇格されるため、理論的には、型charまたはで演算は実行されませんshortが、すべて型intunsigned intまたは変換ランクの高い型(as-の下で)で実行されます。ルールの場合、実装がプロモーションが実際に実行された場合と同じ結果を保証できる場合、プラットフォームが命令を提供する場合、より小さなタイプで演算を実行できます)。

float古い先行標準ルールの下で、を保持するために使用された類似物は、すべての算術などfloatに昇格されました。double

これはもはや当てはまりfloatません。sの算術には、標準化されたCでの自動昇格は含まれません。

混合型の式では、通常、すべてが最大の関連型にプロモートされるため、を比較または追加するfloatdouble、操作の前ににfloat変換されます。double

于 2012-11-16T22:08:47.777 に答える
2

はい、ほとんどのソフトウェア製品にはさまざまなバージョンがあるのと同じように、Cにもさまざまなバージョンがあります。

K&Rは、BrianKernighanとDennisRitchieの著書TheCProgrammingLanguageで説明さいるオリジナルバージョンです

最初の標準化されたバージョンはANSICまたはC89であり、それ以来、いくつかの新しいバージョンがあります。「現在のC」は、C11(最新バージョン)またはC99(おそらく今日最も使用されているバージョン)のいずれかを意味します。

于 2012-11-16T22:02:25.910 に答える
2

C言語の定義は、何年にもわたって標準化および変更されてきました。Cの元の(標準化されていない)バージョンは「K&RC」として知られています。これは、カーニハンとリッチーが最初に開発した言語です。

1989年に、ANSIは言語を定義するための公式の標準文書(1990年にISOによって採用された)を作成し、その標準ではいくつかの変更と拡張が行われました。float変更点の1つは、からへの自動昇格doubleが削除されたことです。

それ以来、この規格には2つの改訂がありました。1つは1999年、もう1つは2011年です。

floatとdoubleを組み合わせた式があるかどうかを理解しようとしていますが、評価時にfloatをdoubleに昇格させるためにCを使用できますか?

現在の標準のルールは次のとおりです。

6.3.1.8通常の算術変換

...
まず、いずれかのオペランドの対応する実数型がである場合long double、もう一方のオペランドは、型ドメインを変更せずに、対応する実数型が。である型に変換されますlong double

それ以外の場合、いずれかのオペランドの対応する実数型がである場合double、もう一方のオペランドは、型ドメインを変更せずに、対応する実数型がである型に変換されますdouble

それ以外の場合、いずれかのオペランドの対応する実数型がである場合float、もう一方のオペランドは、型ドメインを変更せずに、対応する実数型がである型に変換されますfloat62)
62)たとえば、aとenを追加するdouble _Complexと、オペランドがにfloat変換されるだけです (結果が得られます)。floatdoubledouble _Complex

したがって、基本的に、2つの異なるタイプの式がある場合、より狭い/より正確でないタイプのオペランドは、より広い/より正確なタイプのオペランドのタイプにプロモートされます。

于 2012-11-16T22:21:15.177 に答える
1

はい、評価時にフロートを2倍に昇格させるためにCに頼ることができます。

708 Otherwise, if the corresponding real type of either operand is double, the other operand is converted, without change of type domain, to a type whose corresponding real type is double. 

ここにあるドキュメントを使用しています。

申し訳ありませんが、以前に間違ったことを引用しました

于 2012-11-16T22:04:27.080 に答える