C中类型的任何保证最小尺寸?

Tro*_*orn 12 c types cross-platform

您是否可以对数据类型的最小大小做出任何假设?

到目前为止我所读到的内容:

  • char:1个字节
  • 短:2个字节
  • int:2个字节,通常为4个字节
  • 长:4字节

浮动???双???

float.hlimits.h系统是否相关?

Sup*_*ire 30

维基百科文章对此进行了介绍:

A short int不得大于a int.
一个int不得超过一个更大的long int.

A short int必须至少16位长.
一个int必须至少16位长.
A long int必须至少32位长.
A long long int必须至少为64位长.

该标准不要求任何这些尺寸必然不同.例如,如果所有四种类型都是64位长,那么它是完全有效的.

  • 有一个常见的误解,即char = byte = 8-bit.如本回答所述,char很可能是其他大小(如64位).sizeof仅测量给定数据类型中"适合多少个字符".(所以sizeof(char)== 1根据定义) (17认同)
  • 此外,POSIX和Windows都要求`CHAR_BIT`为8,这意味着在普通的桌面/工作站/服务器环境中,`CHAR_BIT`本质上是****.唯一的例外是古老的传统大型机,DSP,以及可能的一些嵌入式系统. (10认同)
  • `char`定义为至少8位(`<limits.h> CHAR_BIT`至少需要8位). (7认同)

Jed*_*ith 11

是的,float.hlimits.h中的值取决于系统.你永远不应该假设类型的宽度,但标准确实规定了一些最小值.参见C99标准中的§6.2.5和§5.2.4.2.1 .

例如,标准只表示a char应该足够大以容纳执行字符集中的每个字符.它没有说它有多宽.

对于浮点大小写,标准提示按类型宽度的顺序给出:

§6.2.5.10

有三种真正的浮动类型,分别为float,doublelong double.32)float类型的值集是double类型的值集的子集; double类型的值集是long double类型的值集的子集.

它们隐含地定义哪个比另一个宽,但没有具体说明它们有多宽."子集"本身是模糊的,因为a long double可以具有完全相同的a范围double并且满足该子句.

这是C的典型代表,每个环境都有很多.你不能假设,你必须要求编译器.

  • char必须是一个字节.但是一个字节不需要是8位. (2认同)

小智 5

但是,新的C99指定(in stdint.h)可选类型的最小尺寸,例如uint_least8_t,int_least32_t等等..
(参见en_wikipedia_Stdint_h)


chu*_*ica 5

九年仍然没有关于最小尺寸的直接答案float, double, long double.


C中类型的任何保证最小尺寸?

对于浮点类型......

实际的角度来看,float最小大小为32位,double64位.C允许doublelong 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
Run Code Online (Sandbox Code Playgroud)

我们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的同义词