长整型和浮点数

4
如果一个长整数和一个浮点数在内存中都需要占用4个字节,那么它们的范围为什么不同呢?
9个回答

12

整数的存储方式如下:

  • 1位用于表示正负(+/-)
  • 31位用于表示数值。

浮点数的存储方式不同,它以牺牲精度为代价提供更大的范围:

  • 1位用于表示正负(+/-)
  • N位用于表示尾数S
  • M位用于表示指数E

浮点数采用指数形式表示: (+/-)S*(基数)^E

另外,“long”并不总是32位,请参见此文章


2
我会点赞的,但是每个“are”和“is”后面都缺少“usually”这个词。 - avakar
4
通常情况下,整数不会带有符号位,而是采用二进制补码进行存储 - http://en.wikipedia.org/wiki/Two%27s_Complement - gnud
1
二进制补码有一个符号位。 - anon
2
“1位符号,31位实际值”不适用于二进制补码——所有位都是实际值的一部分,即使第一位可以用来确定数字的符号。 - gnud
@gnud:同意。我从陈述中删除了“实际”的词语。感谢您指出这一点。 - mingos
显示剩余4条评论

2

编码数字的不同方式。

长整数计数从1到2^(4*8)。

浮点数仅使用32位中的23位进行“计数”。但是它通过指数在其他位上添加“范围”。因此,您可以获得更大的数字,但它们的精度较低(在基数较低的部分):

1.2424 * 10^54(尾数*指数)肯定比2^32大。但是您可以区分长整数2^31和长整数2^31-1,而您无法区分浮点数1.24 * 10^54和浮点数1.24 * 10^54-1:这个1在这个表示中被浮点数忽略了。


1

它们并不总是相同的大小。但即使它们是相同的,它们的范围也不同,因为它们服务于不同的目的。一个是用于没有小数位的整数,另一个是用于小数。


0

这可以从浮点数表示能够表示比定点数表示更大范围数字的角度来解释。这段文字来源于Wikipedia entry

浮点数表示相对于定点数(和整数)表示的优势在于它可以支持更广泛的值范围。例如,一个定点表示法有七个小数位,小数点假定在第五位后面,可以表示12345.67、8765.43、123.00等数字,而浮点表示法(如IEEE 754十进制32位格式)有七个小数位,还可以表示1.234567、123456.7、0.00001234567、1234567000000000等数字。浮点数格式需要略微更多的存储空间(以编码小数点位置),因此在相同的空间中存储时,浮点数以牺牲精度为代价获得了更大的范围。


0

实际上,浮点数占用4个字节(32位),但由于它是浮点数,您必须在这32位中存储不同的内容:

  • 1位用于符号(+/-)
  • 8位用于指数
  • 23位用于有效数字(即显著数字)

您可以看到,浮点数的范围直接取决于分配给有效数字的位数,而最小/最大值取决于为指数分配的位数。

以上面的例子为例:

  • 8位指数(= char大小)给出指数范围[-128,127] --> 最大值约为127*log10(2) = 10^38

关于长整型,您有1位用于符号,然后有31位用于表示整数值,导致最大值为2 147 483 647。

您可以查看维基百科获取更精确的信息: Wikipedia - Floating point


0

它们的范围不同,因为它们使用不同的数字表示方法。

long(在C语言中)相当于long int。这种类型的大小因处理器和编译器而异,但通常是32位,正如您所说。在32位下,它可以表示232个不同的值。由于我们经常想使用负数,计算机通常使用一种称为“二进制补码”的格式来表示整数。这样,我们可以表示从(-231)到(231-1)的数字。加上0这个数字,总共有232个数字。

float(在C语言中)通常是单精度IEEE 754格式化数字。在32位下,这种数据类型也可以有232种不同的比特模式,但它们并不用于直接表示像long中的整数。相反,它们表示一个带有规范化十进制数的符号、尾数和指数。


“float” 可以是 IEEE754,但不一定。如果是,它就没有 2^32 个值。只有 2^32 个位模式,有些值(如 0)可以用多个位模式表示。 - MSalters
使用“values”这个词是有歧义的 - 我试图解释不同的位模式不能直接映射到数字值。已更正。 - gnud

0
通常情况下,当你有更多的值范围时(浮点数最多有10^很多次方),你就会失去精度。
这就是在这里发生的事情。如果你需要整数,32位长整型将会给你更多的选择。

0
在高层次上,浮点数通过牺牲整数精度来扩展其范围。这是通过将基值与缩放因子相结合来实现的。对于大值,浮点数将无法精确表示所有整数,但对于小值,它将比整数精度更好地表示。

-1

在 C 语言中,原始数据类型的大小是由实现定义的。

这篇维基百科条目清楚地说明了:浮点数格式需要稍微更多的存储空间(用于编码小数点的位置),因此当存储在相同的空间时,浮点数以牺牲精度为代价获得更大的范围。


最小尺寸由标准规定。顺便说一下,我没有投反对票。 - anon
没错。但 Dinesh 概括了 “long int” 和 “float” 占用 4 个字节的事实。 - Prasoon Saurav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接