Intとfloatの範囲について質問があります。
両方のサイズが同じ4バイトの場合、なぜ範囲が異なるのですか?
それらは完全に異なります。通常、int
は単純な2の補数の符号付き整数ですが、float
は23ビットの仮数、8ビットの指数、1ビットの符号を持つ単精度浮動小数点表現です( http://en.wikipedia.org/wiki/IEEE_754-2008 )。
内容の解釈が異なるため、値の範囲が異なります。つまり、表現が異なります。
フロートとダブルは通常、次のように表されます
+-+-------+------------------------+
| | | |
+-+-------+------------------------+
^ ^ ^
| | |
| | +--- significand
| +-- exponent
|
+---- sign bit
符号を表す1ビットがある場合s(正の場合は0、負の場合は1)、指数を表すビットの数e、および仮数または分数の残りのビットf。表現されている値はs * f * 2e。
表現できる値の範囲は、指数のビット数によって決まります。指数のビット数が多いほど、可能な値の範囲が広くなります。
precision(非公式には、表現可能な値間のギャップのサイズ)は、仮数部のビット数によって決定されます。すべての浮動小数点値が特定のビット数で正確に表現できるわけではありません。仮数部のビット数が多いほど、2つの表現可能な値の間のギャップが小さくなります。
仮数部の各ビットは1/2を表しますnここで、nは、左から数えたビット数です。
110100...
^^ ^
|| |
|| +------ 1/2^4 = 0.0625
||
|+-------- 1/2^2 = 0.25
|
+--------- 1/2^1 = 0.5
------
0.8125
バイトサイズが同じ2つのタイプは、確かに異なる範囲を持つことができます。
たとえば、signed intとunsigned intはどちらも4バイトですが、32ビットの1つが符号用に予約されているため、デフォルトでは最大値が2倍減少します。また、負の値になる可能性があるため、範囲は異なります。一方、浮動小数点は、10進数の範囲にいくつかのビットを使用することを優先して、値の範囲を失います。
標準ではサイズをバイト単位で指定していませんが、さまざまな整数型が保持できる最小範囲を指定しています。それから最小サイズをバイト単位で推測できます。
標準で保証されている最小範囲(「CおよびC++の整数型」から):
_signed char: -127 to 127
unsigned char: 0 to 255
"plain" char: -127 to 127 or 0 to 255 (depends on default char signedness)
signed short: -32767 to 32767
unsigned short: 0 to 65535
signed int: -32767 to 32767
unsigned int: 0 to 65535
signed long: -2147483647 to 2147483647
unsigned long: 0 to 4294967295
signed long long: -9223372036854775807 to 9223372036854775807
unsigned long long: 0 to 18446744073709551615
_
実際のプラットフォーム固有の範囲値は、CまたはC++にあります(または、ヘッダーにテンプレート化されたstd :: numeric_limits)。
標準はそれだけを要求します:
sizeof(short int) <= sizeof(int) <= sizeof(long int)
float
は、サイズが似ているように見えますが、int
と同じ「解像度」ではありません。 int
は2の補数ですが、float
は23ビットの仮数部、8ビットの指数部、および1ビットの符号で構成されています。
あなたは数値の表現を混合していますが、これはあなた(または他の誰か)が定義するいくつかのルールに依存し、数値を保持するをコンピュータで使用する方法(バイト)。
たとえば、1ビットのみを使用して数値を保持し、0
が-100を表し、1
が+100を表すと決定できます。または、0
は.5を表し、1
は1.0を表します。データとデータの意味の2つは独立しています。
整数は単なる数値です...その範囲はビット数に依存します(符号付き整数と符号なし整数は異なります)。
浮動小数点数はまったく別のものです。これは、浮動小数点数を2進数で表すことに関する単なる慣例です...
符号ビット、指数フィールド、および仮数でコード化されています。
次の記事を読んでください。
http://www.eosgarden.com/en/articles/float/
バイナリの観点から、浮動小数点値とは何かを理解できます。あなたは範囲について理解するでしょう...