整数的存储方式如下:
浮点数的存储方式不同,它以牺牲精度为代价提供更大的范围:
浮点数采用指数形式表示: (+/-)S*(基数)^E
另外,“long”并不总是32位,请参见此文章。
编码数字的不同方式。
长整数计数从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在这个表示中被浮点数忽略了。
它们并不总是相同的大小。但即使它们是相同的,它们的范围也不同,因为它们服务于不同的目的。一个是用于没有小数位的整数,另一个是用于小数。
这可以从浮点数表示能够表示比定点数表示更大范围数字的角度来解释。这段文字来源于Wikipedia entry:
浮点数表示相对于定点数(和整数)表示的优势在于它可以支持更广泛的值范围。例如,一个定点表示法有七个小数位,小数点假定在第五位后面,可以表示12345.67、8765.43、123.00等数字,而浮点表示法(如IEEE 754十进制32位格式)有七个小数位,还可以表示1.234567、123456.7、0.00001234567、1234567000000000等数字。浮点数格式需要略微更多的存储空间(以编码小数点位置),因此在相同的空间中存储时,浮点数以牺牲精度为代价获得了更大的范围。
实际上,浮点数占用4个字节(32位),但由于它是浮点数,您必须在这32位中存储不同的内容:
您可以看到,浮点数的范围直接取决于分配给有效数字的位数,而最小/最大值取决于为指数分配的位数。
以上面的例子为例:
关于长整型,您有1位用于符号,然后有31位用于表示整数值,导致最大值为2 147 483 647。
您可以查看维基百科获取更精确的信息: Wikipedia - Floating point
在 C 语言中,原始数据类型的大小是由实现定义的。
这篇维基百科条目清楚地说明了:浮点数格式需要稍微更多的存储空间(用于编码小数点的位置),因此当存储在相同的空间时,浮点数以牺牲精度为代价获得更大的范围。