19

我对整数和浮点数的范围有疑问:

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

4

6 回答 6

23

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

于 2011-08-16T14:12:31.840 回答
16

它们具有不同的取值范围,因为它们的内容被不同地解释;换句话说,它们有不同的表示

浮点数和双精度数通常表示为

+-+-------+------------------------+
| |       |                        |
+-+-------+------------------------+
 ^    ^                ^
 |    |                |
 |    |                +--- significand
 |    +-- exponent
 |
 +---- sign bit

其中您有 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

这是每个人都应该收藏的链接:每个计算机科学家都应该知道的关于浮点运算的知识。

于 2011-08-16T18:35:46.367 回答
4

具有相同字节大小的两种类型肯定可以具有不同的范围。

例如,signed int 和 unsigned int 都是 4 个字节,但其中一个保留了 32 位中的一个用于符号,默认情况下会将最大值降低 2 倍。此外,范围是不同的,因为一个可以是负数。另一方面,浮点数会丢失值范围,有利于使用一些位作为十进制范围。

于 2011-08-16T14:11:47.697 回答
1

您正在混合数字的表示,这取决于您(或其他人)定义的一些规则,以及您用于将数字保存在计算机中的方式(字节)。

例如,您可以只使用一位来保留一个数字,并决定它0代表-100,并1代表+100。或者0表示 0.5 和11.0。数据和数据的含义这两件事是相互独立的。

于 2011-08-16T14:15:17.453 回答
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

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

标准只要求:

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

floatint尽管它们的大小看似相似,但它们的“分辨率”却不同。int是 2 的补码,而float由 23 位尾数、8 位指数和 1 位符号组成。

于 2011-08-16T14:09:43.697 回答
1

整数只是一个数字......它的范围取决于位数(有符号或无符号整数不同)。

浮点数是完全不同的东西。这只是关于以二进制表示浮点数的约定......

它用符号位、指数字段和尾数编码。

阅读以下文章:

http://www.eosgarden.com/en/articles/float/

它会让你从二进制的角度理解什么是浮点值。你会明白范围的事情......

于 2011-08-16T14:16:49.533 回答