Int是4个字节,范围为+ - 2 ^ 31 Float是4个字节,范围为+ - 1.2E(+ - 38)
Float在Real Line上包含了更多的点,但是等于int的大小。浮点数的符号 - 指数 - 分数表示是如此令人敬畏(或者这个可怜的2的补充)这种大小差异是否会产生?我错过了什么吗?
我发现非常令人惊讶的是,(实际上)代表整个实线的东西与代表整数的大小相同。
答案 0 :(得分:47)
嗯,这是一个快速解释:
int和float通常占用内存中的“单字”。今天,随着向64位系统的转变,这可能意味着你的单词是64位或8字节,允许表示大量的数字。或者,它仍然可以是32位系统,这意味着内存中的每个字占用4个字节。通常,可以逐字访问存储器。
int
和float
之间的差异不是它们在内存中的物理空间,而是ALU(算术逻辑单元)与数字的行为方式。 int表示二进制中直接对应的数字(好吧,几乎 - 它使用two's complement notation)。另一方面,float
被编码(通常采用IEEE 754标准格式)以表示指数形式的数字(即2.99 * 10 ^ 6呈指数形式)。
我认为你的误解在于误解浮点可以代表更多信息。虽然float
s可以表示更大幅度的数字,但它不能用尽可能多的准确度来表示它们,因为它必须考虑编码指数。指数本身可能是一个很大的数字。因此,从浮点数中得到的有效位数越少(表示信息的表示越少),而int
s表示整数范围,它们所代表的数字的大小要小得多。
答案 1 :(得分:22)
我发现非常令人惊讶的是,(实际上)代表整个实线的东西与代表整数的大小相同。
一旦你意识到32位int
可以完全代表整数,而32位float
不能表示整数,那么这一点就不那么令人惊讶了。
float
代表不同数字的数量少于int
,但它们的范围更广。
同样值得注意的是,连续floats
之间的间距随着远离零而变宽,而对于连续ints
则保持不变。
答案 2 :(得分:1)
我认为这里的重点是int是精确的,而float可以是舍入的。 float中的一部分数据描述了小数的位置,而另一部分确定了该值。因此,虽然您可能能够显示1.2E38,但只有前几位数字可能正确,其余数字可以填充为0。
来自:http://en.wikipedia.org/wiki/Floating_point
“七位小数可以另外代表1.234567,123456.7,0.00001234567,1234567000000000等”
这取决于特定系统如何实现浮动。
答案 3 :(得分:0)
也许你应该学习how floating point numbers are represented in a computer.它与表示整数的方式有很大不同。
值得注意的是,int并不总是4字节长,这取决于系统。
答案 4 :(得分:0)
两种类型在实线上表示相同数量的点 - 它们的间距不同。最高和第二高浮动之间的差异是大约。 256!
答案 5 :(得分:0)
根据标准的浮点标准要求base = 2而不是base = 10和24位(精度)。由于它不是基数10,因此基数2格式只能表示一组确定的实数(这是表示实数时出错的固有原因)。这也意味着,正如您之前所说的那样,与int相比,float并不代表更多的数字。
答案 6 :(得分:0)
实际上,某种数据类型的长度因平台而异。但是现在让我们说 float
和 int
是相同的,4 个字节。
4 Bytes 等于 32 位,二进制范围为
<块引用>00000000000000000000000000000000
到
<块引用>11111111111111111111111111111111
此时,我们应该回忆一下几何序列,上面的和等于
<块引用>2^32 + 2^31 + ... + 2^1 + 2^0 = 2147483648
注意,C 重新定义了从数学到语言的范围,如 unsigned
或 signed
通过 shift。
也就是说它也可以定义float
。
SEEEEEEEEMMMMMMMMMMMMMMMMMMMMM
S = 符号(1 位)
E = 指数(8 位)
M = 尾数(23 位)
值计算遵循IEEE-754,这并不容易,但我们可以在754 converter :)
现在,范围,(看到指数技巧了吗?这意味着 E-127,减去!)
<块引用>0 00000001 00000000000000000000000
到
<块引用>0 11111110 11111111111111111111111
从数学,
<块引用>2^-126 * 1.00000000000000000000000 = 1.1754943508222875 × 10^-38
到
<块引用>2^(128) * 1.11111111111111111111111 = 3.7809151880104275 x 10^38
注意尾数有一个隐藏的 1,否则你总是得到 0 :<
最后,机器一开始就是为了挽救生命而构建的,所以在我们选择数据类型之前,我们最好从头文件中检查范围,例如
#include <stdio.h>
#include <limits.h>
#include <float.h>
int main()
{
printf("Range of signed char %d to %d\n", SCHAR_MIN, SCHAR_MAX);
printf("Range of unsigned char 0 to %d\n\n", UCHAR_MAX);
printf("Range of signed short int %d to %d\n", SHRT_MIN, SHRT_MAX);
printf("Range of unsigned short int 0 to %d\n\n", USHRT_MAX);
printf("Range of signed int %d to %d\n", INT_MIN, INT_MAX);
printf("Range of unsigned int 0 to %lu\n\n", UINT_MAX);
printf("Range of signed long int %ld to %ld\n", LONG_MIN, LONG_MAX);
printf("Range of unsigned long int 0 to %lu\n\n", ULONG_MAX);
// In some compilers LLONG_MIN, LLONG_MAX
printf("Range of signed long long int %lld to %lld\n", LLONG_MIN, LLONG_MAX);
// In some compilers ULLONG_MAX
printf("Range of unsigned long long int 0 to %llu\n\n", ULLONG_MAX);
printf("Range of float %e to %e\n", FLT_MIN, FLT_MAX);
printf("Range of double %e to %e\n", DBL_MIN, DBL_MAX);
printf("Range of long double %e to %e\n", LDBL_MIN, LDBL_MAX);
return 0;
}