int和float的大小

时间:2011-08-16 14:08:08

标签: c floating-point integer floating-point-conversion

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

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

6 个答案:

答案 0 :(得分:22)

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

答案 1 :(得分:13)

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

浮点数和双打通常表示为

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

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

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

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

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

 110100...
 ^^ ^
 || |  
 || +------ 1/2^4 = 0.0625
 || 
 |+-------- 1/2^2 = 0.25
 |
 +--------- 1/2^1 = 0.5
                    ------
                    0.8125

以下是每个人都应添加书签的链接:What Every Computer Scientist Should Know About Floating Point Arithmetic

答案 2 :(得分:4)

两个具有相同大小(以字节为单位)的类型可以确定具有不同的范围。

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

答案 3 :(得分: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位符号组成。

答案 4 :(得分:1)

您正在混合数字的表示,这取决于您(或其他人)定义的某些规则,以及您使用保持数字的方式电脑(字节)。

例如,您只能使用一位来保留数字,并确定0代表-100,1代表+100。或者0代表.5而1代表1.0。这两件事,数据和数据的含义是独立的。

答案 5 :(得分:1)

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

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

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

阅读以下文章:

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

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