任何保证Ctypes的最小尺寸?
你通常可以做任何关于数据types的最小尺寸的假设吗?
到目前为止,我读到的是:
- char:1个字节
- 简短:2字节
- int:2个字节,通常为4个字节
- 长:4字节
浮动??? 双???
float.h
和limits.h
系统中的值是否依赖于?
这在维基百科的文章中有介绍 :
short int
不能大于int
。
int
不能大于long int
。
short int
必须至less有16位长。
一个int
必须至less有16位长。
long int
必须至less有32位长。
long long int
必须至less有64位长。该标准并不要求这些尺寸中的任何一个都必须是不同的。 例如,如果所有四种types都是64位长,则是完全有效的。
是的, float.h
和limits.h
中的值是依赖于系统的。 你不应该对一个types的宽度做出假设,但是这个标准确实会给出一些最小值。 参见C99标准的 §6.2.5和§5.2.4.2.1。
例如,标准只是说一个char
应该足够大,以容纳执行字符集中的每个字符。 这并不是说它有多宽。
对于浮点情况,标准提示的types的宽度的顺序是:
§6.2.5.10
有三种真正的 浮动 types ,分别是float , double和long double 。 32) floattypes的值的集合是typesdouble值的集合的子集; doubletypes的值的集合是long doubletypes的值集合的子集。
他们含蓄地定义哪一个比另一个宽,但不具体是多宽。 “子集”本身是模糊的,因为long double
可以有一个完全相同的double
范围,并满足这个条款。
这很像C的典型代表,很多都留给每个单独的环境。 你不能假设,你必须要问编译器。
但是,新的C99指定(在stdint.h
)最小大小的可选types,如uint_least8_t
, int_least32_t
等等。
(请参阅en_wikipedia_Stdint_h )
如果您不想检查系统/平台上任何types的大小(以字符的倍数),那么确实是您期望的大小,您可以:
enum CHECK_FLOAT_IS_4_CHARS { IF_THIS_FAILS_FLOAT_IS_NOT_4_CHARS = 1/(sizeof(float) == 4) };
开发人员经常会问这样的问题,他们正在处理一个打包的struct
来匹配定义的内存布局(如消息协议)。 这个假设是,语言应该直接指定为此目的而布置16,24,32位等字段。
对于汇编语言和其他与特定CPU架构紧密相关的应用程序特定语言而言,这是常规和可接受的,但是在通用语言中有时会遇到问题,这可能是针对谁知道的,哪种架构。
实际上,C语言并不是针对特定的硬件实现的。 这是C编译器实现者一般指定的,可以适当地适应特定CPU的实际情况。 一个由9位字节,54位字和72位存储器地址组成的科学怪人的硬件结构可以很容易地被明确地映射到C特征上。 ( char
是9位; short int
, int
和long int
是54位。)
这个一般性是为什么C规范说了一些东西,“除了sizeof(char)<= sizeof(short int)<= sizeof(int)<= sizeof(long int)之外,不要期望更多的ints的大小。 “ 这意味着字符可以和长短一样大小!
目前的现实是,而且未来似乎保持不变 – 软件需求体系结构提供8位字节,而内存字可作为单个字节寻址。 这并不总是如此。 不久之前,我开始研究具有6位“字节”和60位字的CDC Cyber架构。 AC的实现将是有趣的。 事实上,如果有人记得那个架构是Pascal怪异的包装语义的责任。
引用标准确实给出了被定义为“正确答案”的内容,但实际上并没有反映出程序通常被写入的方式。
人们总是假设char是8位,short是16,int是32,long是32或64,long long是64。
这些假设是不是一个好主意,但你不会因为制造它们而被解雇。
从理论上讲, <stdint.h>
可以用来指定固定位宽的types,但是你必须为Microsoft分配一个。 ( 这里请参阅MS stdint.h )其中一个问题是C ++在技术上只需要C89的兼容性就是一个合适的实现; 即使是普通的C,即使在2009年,C99也没有得到充分的支持。
说char
没有宽度规格也是不准确的。 有,标准只是避免说是否签署。 这是C99实际上说的:
- 不是位域的最小对象的位数(字节)
CHAR_BIT 8
- types为signed char的对象的最小值
SCHAR_MIN -127
// – (2 7 – 1) - chartypes的对象的最大值
SCHAR_MAX +127
// 2 7 – 1 - types为unsigned char的对象的最大值
UCHAR_MAX 255
// 2 8 – 1
大多数库定义如下:
#ifdef MY_ARCHITECTURE_1 typedef unsigned char u_int8_t; typedef short int16_t; typedef unsigned short u_int16_t; typedef int int32_t; typedef unsigned int u_int32_t; typedef unsigned char u_char; typedef unsigned int u_int; typedef unsigned long u_long; typedef unsigned short u_short; #endif
你可以在程序中使用这些typedef而不是标准types。
C99 N1256标准草案
C99指定了两种types的整数保证:
- 最小尺寸保证
- types之间的相对大小
相对保证
6.2.5types :
8对于具有相同符号和不同整数转换等级(见6.3.1.1)的任何两个整数types,具有较小整数转换等级的types的值的范围是另一types的值的子范围。
和6.3.1.1布尔,字符和整数决定了相对转换等级:
1每个整数types都有一个整数转换等级定义如下:
- long long int的级别应大于long int的级别,该级别应大于int的级别,该级别应大于short int的级别,该级别应大于signed char的级别。
- 任何无符号整数types的等级应等于相应的有符号整数types的等级(如果有的话)。
- 对于所有整数typesT1,T2和T3,如果T1的排名大于T2,T2的排名大于T3,则T1的排名大于T3
绝对最小尺寸
提到https://stackoverflow.com/a/1738587/895245 ,这里是方便的报价。
5.2.4.2.1整数types的大小<limits.h>
:
1 […]其实施定义的数值应等于或大于所示数值(绝对值)
- UCHAR_MAX 255 // 2 8 – 1
- USHRT_MAX 65535 // 2 16 – 1
- UINT_MAX 65535 // 2 16 – 1
- ULONG_MAX 4294967295 // 2 32 – 1
- ULLONG_MAX 18446744073709551615 // 2 64 – 1
浮点
如果定义了__STDC_IEC_559__
macros,那么对于每个Ctypes都保证IEEEtypes: 假设使用C中的IEEE754浮点数来表示浮点是否安全?