int和float的大小
我有关于整数和浮点范围的问题:
如果它们都具有相同的4字节大小,为什么它们具有不同的范围?
它们完全不同 – 通常int
只是一个简单的2的补码有符号整数,而float
是一个单精度浮点表示,有23位尾数,8位指数和1位符号(见http://en.wikipedia.org/ wiki / IEEE_754-2008 )。
它们具有不同的值范围,因为它们的内容被不同地解释; 换句话说,他们有不同的表现forms 。
浮动和双打通常表示为类似的东西
+-+-------+------------------------+ | | | | +-+-------+------------------------+ ^ ^ ^ | | | | | +--- 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
这里有一个每个人应该加入书签的链接: 每个计算机科学家应该知道的关于浮点运算的内容 。
具有相同大小(字节)的两种类型可以确定具有不同的范围。
例如,signed int和unsigned int都是4个字节,但是其中一个为该符号保留了32位中的一个,默认情况下将最大值降低2倍。 此外,范围是不同的,因为一个可能是负面的。 另一方面,浮点数会失去值范围,有利于使用一些小数位。
标准没有指定大小(以字节为单位),但它指定了各种整数类型必须能够容纳的最小范围。 您可以从中推断出最小字节数。
标准保证的最小范围(来自“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)
尽管看起来大小相似,但float
与int
没有相同的“分辨率”。 int
是2的补码,而float
由23位尾数,8位指数和1位符号组成。
您正在混合数字的表示forms ,这取决于您(或其他人)定义的某些规则,以及您用于将数字保存在计算机中的方式(字节)。
例如,您只能使用一位来保留数字,并确定0
代表-100,1代表+100。 或者0
代表.5和1
代表1.0。 这两件事,数据和数据的含义是独立的。
整数只是一个数字……它的范围取决于位数(有符号或无符号整数不同)。
浮点数是完全不同的东西。 这只是一个关于用二进制表示浮点数的约定……
它用符号位,指数字段和尾数编码。
阅读以下文章:
http://www.eosgarden.com/en/articles/float/
从二进制角度来看,它将使您了解浮点值是什么。 你会理解范围的东西……