C int和float的大小

C int和float的大小,c,floating-point,integer,floating-point-conversion,C,Floating Point,Integer,Floating Point Conversion,我对整数和浮动的范围有一个问题: 如果它们都具有相同的4字节大小,为什么它们具有不同的范围?标准没有指定以字节为单位的大小,但它指定了各种整数类型必须能够保持的最小范围。您可以从中推断最小大小(以字节为单位) 标准保证的最小范围(从“C和C++中的整数类型”开始): 实际平台特定的范围值在C或C++中找到(或者更好,模板STD::NealMigiLi限制在页眉中)。 标准仅要求: sizeof(short int)两个字节大小相同的类型肯定会有不同的范围 例如,signed int和unsign

我对整数和浮动的范围有一个问题:


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

标准没有指定以字节为单位的大小,但它指定了各种整数类型必须能够保持的最小范围。您可以从中推断最小大小(以字节为单位)

标准保证的最小范围(从“C和C++中的整数类型”开始):

实际平台特定的范围值在C或C++中找到(或者更好,模板STD::NealMigiLi限制在页眉中)。 标准仅要求:


sizeof(short int)两个字节大小相同的类型肯定会有不同的范围


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

它们完全不同-通常
int
只是一个简单的2的补码有符号整数,而
float
是一个单精度浮点数表示,包含23位尾数、8位指数和1位符号(请参阅).

您正在混合数字的表示形式,这取决于您(或其他人)定义的某些规则,以及您在计算机中保存数字的方式(字节)


例如,您可以仅使用一位来保留一个数字,并确定
0
表示-100,而
1
表示+100。或者
0
表示0.5,
1
表示1.0。数据和数据的含义这两件事是独立的。

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

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

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

阅读以下文章:


它将使您从二进制的角度理解什么是浮点值。你会理解范围的事情…

它们有不同的值范围,因为它们的内容解释不同;换句话说,它们有不同的表示形式

浮点数和双精度浮点数通常表示为

+-+-------+------------------------+
| |       |                        |
+-+-------+------------------------+
 ^    ^                ^
 |    |                |
 |    |                +--- significand
 |    +-- exponent
 |
 +---- sign bit
其中1位表示符号s(0表示正,1表示负),一些位数表示指数e,其余位数表示有效位或分数f。表示的值是s*f*2e

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

精度(非正式地说,代表值之间的间隙大小)由有效位中的位数决定。并非所有的浮点值都可以用给定的位数精确表示。有效位中的位数越多,任意两个可表示值之间的间距越小

有效位中的每一位表示1/2n,其中n是从左侧开始计数的位数:

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

这里有一个每个人都应该加入书签的链接:。

这似乎并没有回答实际问题?
float
不是一个整数类型。在Visual C和int中,float的范围是3.4E+/-38(7位),int有–2147483648到2147483647,两者都有4个字节,那么为什么会有如此大的范围差异,以及如何实现?事实上,这就是我想要的know@Monkey:好的-您现在编辑它是为了添加一个关于浮动的句子,但是原始答案甚至没有提到浮动。显然,许多其他人在编辑之前看到了原始答案,但它没有关于浮动的句子。不过没关系,因为你修好了。不过,您可能想去掉关于不同整数大小和范围的大部分无关内容。+1当然,你比我更清楚,这些只是通常的表述。事实上,因为这显然是一个noob问题,我认为最好保持简单。@Andreas Brinck我的意思是,标准没有规定这些表述必须是表述。@Andreas,cnicutar:澄清一下,C标准不要求实现使用IEEE-754。@Andreas Brinck-除了IEEE 754之外,还有很多浮点格式;早在晚白垩世,我就在研究VAX,它使用VAX F格式。C语言标准不关心实现所使用的特定浮点格式,它只要求最小范围和精度。学究式地说,C整数类型也和浮点类型一样,只是“关于表示的约定”。另外,你在第二段中有一个循环定义!“Floats[…]lose value range”听起来好像一个浮点数所代表的最大数小于一个相同大小的整数所代表的最大数,这绝对不是真的。
 110100...
 ^^ ^
 || |  
 || +------ 1/2^4 = 0.0625
 || 
 |+-------- 1/2^2 = 0.25
 |
 +--------- 1/2^1 = 0.5
                    ------
                    0.8125