3


1

C / C99標準の作者が、sizeof浮動小数点型に..standardを指定しないのはなぜですか?

WindowsとLinux x86では、floatは4バイト、doubleは8ですが、long doubleはx86とx86_64でそれぞれ12と16に気付きました。 C99は、特定の整数サイズでこのような障壁を破ることになっています。

最初の技術的な制限は、x86プロセッサが80ビット以上の浮動演算(および切り上げるために2バイト)を処理できないためであるように見えますが、なぜint型と比較して標準の不一致が原因ですか? 少なくとも80ビットの標準化を行わないのはなぜですか?

3 回答


5


C言語はさまざまなタイプの実装を指定していないため、可能な限りさまざまなハードウェアに効率的に実装できます。

これは整数型にも拡張されます-C標準整数型には最小の_ranges_があります(例: 「signed char」は-127から127、「short」および「int」は両方とも-32,767から32,767、「long」は-2,147,483,647から2,147,483,647、「long long」は-9,223,372,036,854,775,807から9,223,372,036,854,775,807です) ほとんどすべての目的のために、これはプログラマが知る必要があるすべてです。

C99は `int32_t`のような「固定幅」整数型を提供します-しかし、これらは_optional_-実装がそのような型を効率的に提供できない場合、提供する必要はありません。

浮動小数点型の場合、同等の制限があります(たとえば、「double」には10桁以上の精度が必要です)。


3


彼らは(ほとんど)既存のC実装に対応しようとしていましたが、そのいくつかはIEEE浮動小数点形式さえ使用していません。


1


`int`は、ID、色、エラーコード、リクエストなどの抽象的なものを表すために使用できます。 この場合、 `int`は実際には整数値としてではなく、ビットのセット(=コンテナ)として使用されます。 ほとんどの場合、プログラマは必要なビット数を正確に知っているので、必要なだけのビットを使用できるようにしたいと考えています。

一方、「float」は非常に特殊な用途向けの設計です(浮動小数点演算)。 「float」に必要なビット数を正確にサイズ設定することはできません。 実際、ほとんどの場合、ビットが多ければ多いほど良いです。