Tro*_*orn 12 c types cross-platform
您是否可以对数据类型的最小大小做出任何假设?
到目前为止我所读到的内容:
浮动???双???
值float.h和limits.h系统是否相关?
Sup*_*ire 30
A
short int不得大于aint.
一个int不得超过一个更大的long int.A
short int必须至少16位长.
一个int必须至少16位长.
Along int必须至少32位长.
Along long int必须至少为64位长.该标准不要求任何这些尺寸必然不同.例如,如果所有四种类型都是64位长,那么它是完全有效的.
Jed*_*ith 11
是的,float.h和limits.h中的值取决于系统.你永远不应该假设类型的宽度,但标准确实规定了一些最小值.参见C99标准中的§6.2.5和§5.2.4.2.1 .
例如,标准只表示a char应该足够大以容纳执行字符集中的每个字符.它没有说它有多宽.
对于浮点大小写,标准提示按类型宽度的顺序给出:
有三种真正的浮动类型,分别为float,double和long double.32)float类型的值集是double类型的值集的子集; double类型的值集是long double类型的值集的子集.
它们隐含地定义哪个比另一个宽,但没有具体说明它们有多宽."子集"本身是模糊的,因为a long double可以具有完全相同的a范围double并且满足该子句.
这是C的典型代表,每个环境都有很多.你不能假设,你必须要求编译器.
九年仍然没有关于最小尺寸的直接答案float, double, long double.
C中类型的任何保证最小尺寸?
对于浮点类型......
从实际的角度来看,float最小大小为32位,double为64位.C允许double并long double共享相似的特征,因此a long double可以小到a double.  例1.
我可以想象一个符合C标准的48位double可能已经存在 - 但却不知道.
现在,让我们想象一下,我们富有的叔叔去世了,给我们留下了一笔财富,为www.smallest_C_float.com的发展和文化推广付出了代价.
C指定:
1)float有限范围至少为[1E-37 ... 1E + 37].看到FLT_MIN, FLT_MAX
2)(1.0f + FLT_EPSILON) – 1.0f <= 1E-5.
3)float支持正值和负值.
Let X: Digit 1-9
Let Y: Digit 0-9
Let E: value -37 to 36
Let S: + or -
Let b: 0 or 1
我们float可以使用10的基数来最小地表示所有组合SX.YYYYY*10^E.
0.0并且±1E+37还需要(另外3个).我们不需要-0.0,子法线,±无穷大,也不需要数字.
那是2*9*10 ^ 5*74 + 3组合或133,200,003,需要至少27位才能编码 - 不知何故.回想一下目标是最小的尺寸.
使用经典的基数2方法,我们可以假设隐含1并获得S1.bbbb_bbbb_bbbb_bbbb_b*2 ^ e或2*2 ^ 17*226组合或26位.
如果我们尝试16,那么我们需要大约2*15*16 ^(4或5)*57组合或至少26到30位.
结论:AC float至少需要26位编码.
C double不需要表达比指数范围更大的指数范围float,它只需要不同的最小精度要求.1E-9.
S1.bbbb_bbbb_bbbb_bbbb_bbbb_bbbb_bbbb_bb*2 ^ e - > 2*2 ^ 30*226组合或39位.
在我们想象你的计算机上,我们可以有一个13位char,所以编码float, double, long double没有填充.因此,我们可以实现非填充的26位float和39位double, long double.
1:用于x86的Microsoft Visual C++,它使double成为double的同义词
| 归档时间: | 
 | 
| 查看次数: | 8264 次 | 
| 最近记录: |