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

C中类型的任何保证最小尺寸?,c,types,cross-platform,C,Types,Cross Platform,通常,您能否对数据类型的最小大小做出任何假设 到目前为止,我读到的是: 字符:1字节 短:2字节 int:2字节,通常为4字节 长:4字节 浮动???双人 float.h和limits.h中的值是否取决于系统?是的,float.h和limits.h中的值取决于系统。你不应该对字体的宽度做任何假设,但是标准确实规定了一些最小值。请参见附录中的§6.2.5和§5.2.4.2.1 例如,标准仅规定char应足够大,以容纳执行字符集中的每个字符。它没有说它有多宽 对于浮点型,标准提示类型宽度的给定顺

通常,您能否对数据类型的最小大小做出任何假设

到目前为止,我读到的是:

  • 字符:1字节
  • 短:2字节
  • int:2字节,通常为4字节
  • 长:4字节
浮动???双人


float.h
limits.h
中的值是否取决于系统?

是的,
float.h
limits.h
中的值取决于系统。你不应该对字体的宽度做任何假设,但是标准确实规定了一些最小值。请参见附录中的§6.2.5和§5.2.4.2.1

例如,标准仅规定
char
应足够大,以容纳执行字符集中的每个字符。它没有说它有多宽

对于浮点型,标准提示类型宽度的给定顺序:

§6.2.5.10 有三种真正的浮动类型,分别为浮动双浮动长浮动 加倍。32)浮动类型的值集是双重类型的值集的子集;double类型的值集是long double类型的值集的子集

它们隐式地定义了哪一个比另一个宽,但没有具体定义它们的宽度。“子集”本身是模糊的,因为
长双精度
可以具有与
双精度
完全相同的范围,并满足此子句

这是C语言的典型运行方式,每个环境都有很多问题需要解决。您不能假设,您必须询问编译器。

这在以下内容中有介绍:

short int
不能大于
int

int
不能大于
长int

short int
的长度必须至少为16位。
int
的长度必须至少为16位。
long int
的长度必须至少为32位。
长整型的
长度必须至少为64位

本标准不要求这些尺寸中的任何一个必须不同。例如,如果所有四种类型都是64位长的,那么它是完全有效的


但是,新的C99指定了(在
stdint.h
中)最小尺寸的可选类型,如
uint\u least8\u t
int\u least32\u t
,等等。

(请参阅)

大多数库定义如下:

#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而不是标准类型。

引用标准确实给出了定义为“正确答案”的内容,但它实际上并不反映程序的一般编写方式

人们一直假设char是8位,short是16位,int是32位,long是32位或64位,long-long是64位

这些假设不是一个好主意,但你不会因为做出这些假设而被解雇

理论上,
可以用于指定固定的位宽度类型,但您必须为Microsoft查找一种。(一)这里的问题之一是C++技术上只需要C89兼容性是一致的实现;即使对于普通C,C99在2009年也不完全受支持

char
没有宽度规范也是不准确的。有一点,标准只是避免说明是否签署。以下是C99实际上所说的:

  • 非位字段的最小对象的位数(字节)
    字符位8

  • 类型为signed char的对象的最小值
    SCHAR_MIN-127
    /-(27-1)
  • 类型为signed char的对象的最大值
    SCHAR_MAX+127
    /27-1
  • 类型为unsigned char的对象的最大值
    UCHAR_MAX 255
    /28-1

通常,提出此类问题的开发人员正在处理如何安排打包的
结构
以匹配定义的内存布局(如消息协议)。假设语言应该直接指定用于此目的的16、24、32位等字段的布局

这对于汇编语言和其他与特定CPU体系结构密切相关的特定于应用程序的语言来说是常规的和可接受的,但在通用语言中有时是一个问题,可能是针对谁知道什么样的体系结构

事实上,C语言并不适用于特定的硬件实现。它的指定通常是为了使C编译器实现人员能够正确地适应特定CPU的实际情况。一个由9位字节、54位字和72位内存地址组成的弗兰肯斯坦硬件体系结构很容易明确地映射到C特性。(
char
为9位;
short int
int
long int
为54位。)

这就是为什么C规范说“不要对超过sizeof(char)的int的大小有太多期望”的原因,如果您不想检查系统/平台上任何类型的大小(以char的倍数表示),那么您可以:

enum CHECK_FLOAT_IS_4_CHARS
{
   IF_THIS_FAILS_FLOAT_IS_NOT_4_CHARS = 1/(sizeof(float) == 4)
};

C99 N256标准草案

C99指定两种类型的整数保证:

  • 最小尺寸保证
  • 类型之间的相对大小
相对担保

6.2.5类型:

8用于具有相同符号性和不同整数转换秩的任意两个整数类型 (见6.3.1.1),整数转换秩较小的类型的值范围为a 其他类型的值的子范围

和6.3.1.1布尔、字符和整数决定相对转换等级:

1每个整数类型都有一个整数转换秩,定义如下:

  • 长整型的秩应大于th