在ANSI C固定宽度的整数(Fixed-width integers in ANSI C)

2019-09-20 02:26发布

How do I handle a 4-byte char array as a typical int in ANSI C?

一些背景:

我解析的二进制文件,我需要读4字节无符号整数。

我想确保,不管是什么平台,此解析器被编译,一个“诠释”始终是4个字节长。

我读过有关uint32_t的和朋友,但我仅限于ANSI C.

提前致谢。

Answer 1:

扔在那里的一些预处理命令

#include <limits.h>

#if LONG_BIT == 32
    long buffer [BUFFER_SIZE];
#elif WORD_BIT == 32
    int buffer [BUFFER_SIZE];
#endif

你也可以在运行时使用sizeof(int)的。



Answer 2:

我建议,而不是试图覆盖数据,你可能会更好只是写功能,做这样的事情uint32 GetUInt32LE(unsigned char *dat)然后可以被实现为return ((uint32)(dat[3]) << 24) | ((uint32)(dat[2]) << 16) | ((uint32)(dat[1]) << 8) | dat[0]; return ((uint32)(dat[3]) << 24) | ((uint32)(dat[2]) << 16) | ((uint32)(dat[1]) << 8) | dat[0]; 为最大可移植性(假定一个定义uint32合适地),或者可以在其中系统稍微更简单地定义int被称为是32位或更大。 需要注意的是仍然有较小的系统,其中一些嵌入式编译器int是只有16位,因此需要在各个字节的转换。 对铸造dat[1]需要在这样的系统中,因为否则移位一个字节值,像0xFF的八个左否则将产生不确定的行为,其最可能的实际的结果将是把它解释为(INT)(为0xFF00),这将是符号-Extended到0xFFFFFF00,重挫结果的两个高位字节。



文章来源: Fixed-width integers in ANSI C