如何在C中创建24位无符号整数

巴格罗德

我正在研究RAM非常紧张的嵌入式应用程序。为此,我需要创建一个24位无符号整数数据类型。我正在使用一个结构:

typedef struct
{
    uint32_t v : 24;
} uint24_t;

但是,当我询问此类型的变量的大小时,它将返回“ 4”,即:

    uint24_t x;
    x.v = 0;
    printf("Size = %u", sizeof(x));

有没有一种方法可以强制此变量具有3个字节?

最初,我认为这是因为它迫使数据类型必须按字对齐,但是例如,我可以这样做:

typedef struct
{
    uint8_t blah[3];
} mytype;

在这种情况下,大小为3。

紫罗兰色

好吧,您可以尝试确保结构仅占用所需的空间,例如:

#pragma pack(push, 1)
typedef struct { uint8_t byt[3]; } UInt24;
#pragma pack(pop)

可能必须提供那些编译器指令(如#pragma上面行)以确保没有填充,但这对于只有八位字段(a)的结构可能是默认的

然后,您可能必须将实际值打包到结构中或从结构中解压缩出来,例如:

// Inline suggestion used to (hopefully) reduce overhead.

inline uint32_t unpack(UInt24 x) {
    uint32_t retVal = x.byt[0];
    retval = retVal << 8 | x.byt[1];
    retval = retVal << 8 | x.byt[2];
    return retVal;
}

inline UInt24 pack(uint32_t x) {
    UInt24 retVal;
    retVal.byt[0] = (x >> 16) & 0xff;
    retVal.byt[1] = (x >> 8) & 0xff;
    retVal.byt[2] = x & 0xff;
    return retVal
}

请注意,无论您使用的是哪种实际体系结构,这都将为您提供big-endian值。如果只打包和解包,这无关紧要,但是如果您想在特定布局中的其他地方使用内存块,则可能会出现问题(在这种情况下,您可以更改打包/打包代码以使用所需的格式)。

这种方法向您的系统添加了一些代码(可能会降低性能),因此您必须决定是否值得节省使用的数据空间。


(a)例如,对于下面的程序,都显示gcc 7.3和,clang 6.0表明3 6该结构内部或之后没有填充:

#include <stdio.h>
#include <stdint.h>

typedef struct { uint8_t byt[3]; } UInt24;
int main() {
    UInt24 x, y[2];
    printf("%zd %zd\n", sizeof(x), sizeof(y));
    return 0;
}

然而,这只是一个样品,所以你可能要考虑,在移植代码的兴趣,使用类似#pragma pack(1),或将在代码赶上在这可能并非如此环境。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在 JavaScript 中创建大小为 128 位的无符号整数数组?

24位无符号整数

如何在C ++中采用输入128位无符号整数

如何在AVX2中从32位无符号整数转换为16位无符号整数?

c中的3位无符号整数

如何在C中生成随机的64位无符号整数

Clojure中的无符号16位整数

如何在Java中将有符号的16位整数转换为无符号的16位整数?

C ++中的无符号整数

如何在js中打包无符号整数?

如何在Android中设置byte []长度的无符号整数

如何将16位无符号整数转换为较大的8位无符号整数?

C中的有符号和无符号整数的按位非

获取无符号整数中位的整数值

如何在C中将有符号整数转换为相应的无符号整数?

如何在python中将整数转换为无符号的32位?

如何在Matlab中将大量的16位无符号整数转换为ASCII字符串

C:如何将2个32位无符号整数的结果保存为有符号整数

C中的无符号位长移位

如何将 16 位无符号整数转换为 8 位无符号字符并最终返回无符号字符*?

如何直接在numpy数据类型中为16位无符号整数指定尾数?

16位无符号整数数组,输出的元素多于c中的初始化大小

在C#中从BitArray转换为16位无符号整数

在无符号短整数中按位存储日期:为什么我的结果减 1?[C]

如何打印提升多精度 128 位无符号整数

在无符号整数中查找某些位模式

在C语言中使用128位无符号整数

C中的无符号整数下溢

无符号整数在C中溢出