1

我有以下整数结构(32位环境):

struct rgb {
    int r;
    int g;
    int b;
};

我是否正确地说,由于 rgb 组件值(0-255)只需要 8 位(1 个字节)来表示,我只使用 1 个字节的内存并为每个组件留下 3 个未使用的字节?

此外,如果我改为执行以下操作:

struct rgb{
    unsigned int r:8;
    unsigned int g:8;
    unsigned int b:8;
};

假设我上面所说的是正确的,使用这个新结构会将未使用的字节数减少到 1 吗?

4

5 回答 5

5

我会使用unsigned char,这正是您所需要的。喜欢

#ifndef BYTE
#define BYTE unsigned char
#endif

struct rgb
{
    BYTE r;
    BYTE g;
    BYTE b;
};

但是要回答您的问题 - 是的,它确实将每个字段的字节数减少到 1。

无论如何,由于@JimBuck 的评论,由于对齐方式(但这些是细节,并且完全是特定于平台的),该结构的大小可能为 4B

于 2011-11-20T17:47:59.017 回答
3

对,那是正确的。第二种解决方案基本上将结构分解为单个 int,每个成员有 8 位。

#include "stdio.h"

struct rgb{
    unsigned int r:8;
    unsigned int g:8;
    unsigned int b:8;
};

int main(void) {
        printf("Size of RGB: %d", sizeof(struct rgb));
        return 0;
}

这将输出:“RGB 大小:4”。但正如其他人所建议的那样,最好使用 8 位附带的数据类型,ergo: unsigned char

于 2011-11-20T17:48:51.423 回答
2

整数是 32 位 -> 4 字节。我会改用 unsigned char,它只有 1 个字节,包含值 0-255。

使用 typedef 为类型定义一个新名称,使用起来更方便。

typedef unsigned char t_byte;

struct rgb {
    t_byte r;
    t_byte g;
    t_byte b;
};
于 2011-11-20T17:47:38.143 回答
1

Unsigned int 仍然是相同的大小,你想要 unsigned char

struct rgb{
    unsigned char r;
    unsigned char g;
    unsigned char b;
};

但是,您应该记住,该标准并未强制要求它们不能更大——它们可能会更大。您可能需要使用打包的编译指示来获得您想要的准确对齐。

你也可以使用unsigned char rgb[3]

于 2011-11-20T17:46:42.797 回答
1

在第一个示例中,您为每个颜色分量分配 4 个字节。对于 8 位颜色,您应该使用 unsigned char 仅分配一个字节。这里不需要位域。

请注意,您在此处定义了一个 24 位像素。如果您使用 32 位像素,您可能需要添加填充。

于 2011-11-20T17:46:44.700 回答