int和float的大小

atu*_*tul 17 c floating-point integer floating-point-conversion

我有一个关于整数和浮点范围的问题:

如果它们都具有相同的4字节大小,为什么它们具有不同的范围?

Pau*_*l R 22

它们完全不同 - 通常int只是一个简单的2的补码有符号整数,float而是一个单精度浮点表示,有23位尾数,8位指数和1位符号(见http://en.wikipedia.org/wiki/ IEEE_754-2008).

  • +1当然,你比我更清楚这些只是通常的表现形式. (2认同)

Joh*_*ode 14

它们具有不同的值范围,因为它们的内容被不同地解释; 换句话说,他们有不同的表现形式.

浮动和双打通常表示为类似的东西

+-+-------+------------------------+
| |       |                        |
+-+-------+------------------------+
 ^    ^                ^
 |    |                |
 |    |                +--- significand
 |    +-- exponent
 |
 +---- sign bit
Run Code Online (Sandbox Code Playgroud)

其中有1位表示符号s(0表示正数,1表示负数),表示指数e的某些位数,以及有效数字或分数f的其余位数.表示的值是s*f*2 e.

可以表示的值的范围由指数中的位数确定; 指数中的位越多,可能值的范围越宽.

精度(非正式地,可表示的值之间的间隙的尺寸)是由在有效数位的数目确定的.并非所有浮点值都可以在给定的位数中精确表示.您在有效数字中的位数越多,任何两个可表示的值之间的差距就越小.

有效数字中的每个位代表1/2 n,其中n是从左数起的位数:

 110100...
 ^^ ^
 || |  
 || +------ 1/2^4 = 0.0625
 || 
 |+-------- 1/2^2 = 0.25
 |
 +--------- 1/2^1 = 0.5
                    ------
                    0.8125
Run Code Online (Sandbox Code Playgroud)

这里有一个每个人都应该收藏的链接:每个计算机科学家应该知道的关于浮点运算的内容.


小智 1

该标准没有指定字节大小,但指定了各种整数类型必须能够容纳的最小范围。您可以从中推断出最小大小(以字节为单位)。

标准保证的最小范围(来自“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
Run Code Online (Sandbox Code Playgroud)

实际的特定于平台的范围值可在 C 或 C++ 中找到(或者更好的是,标头中的模板化 std::numeric_limits)。

标准仅要求:

sizeof(short int) <= sizeof(int) <= sizeof(long int)

float尽管它们的尺寸看起来相似,但它们的“分辨率”并不相同intint是 2 的补码,而float由 23 位尾数、8 位指数和 1 位符号组成。

  • 这似乎并没有回答实际问题? (8认同)
  • @Monkey:好的 - 您现在已经编辑它以添加关于浮动的句子,但原始答案甚至没有提到浮动。 (2认同)
  • 显然,许多其他人在编辑之前看到了原始答案,因为它没有关于浮动的句子。不过没关系,既然你修好了。不过,您可能想要删除大部分与不同整数大小和范围无关的内容。 (2认同)