Float和Int都是4字节?怎么会?

时间:2012-01-05 16:58:39

标签: floating-point int

Int是4个字节,范围为+ - 2 ^ 31 Float是4个字节,范围为+ - 1.2E(+ - 38)

Float在Real Line上包含了更多的点,但是等于int的大小。浮点数的符号 - 指数 - 分数表示是如此令人敬畏(或者这个可怜的2的补充)这种大小差异是否会产生?我错过了什么吗?

我发现非常令人惊讶的是,(实际上)代表整个实线的东西与代表整数的大小相同。

7 个答案:

答案 0 :(得分:47)

嗯,这是一个快速解释:

int和float通常占用内存中的“单字”。今天,随着向64位系统的转变,这可能意味着你的单词是64位或8字节,允许表示大量的数字。或者,它仍然可以是32位系统,这意味着内存中的每个字占用4个字节。通常,可以逐字访问存储器。

intfloat之间的差异不是它们在内存中的物理空间,而是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)

实际上,某种数据类型的长度因平台而异。但是现在让我们说 floatint 是相同的,4 个字节。

4 Bytes 等于 32 位,二进制范围为

<块引用>

00000000000000000000000000000000

<块引用>

11111111111111111111111111111111

此时,我们应该回忆一下几何序列,上面的和等于

<块引用>

2^32 + 2^31 + ... + 2^1 + 2^0 = 2147483648

注意,C 重新定义了从数学到语言的范围,如 unsignedsigned 通过 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;
}