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

はい、その通りです。2番目のソリューションは、基本的に、構造体を各メンバーに8ビットの単一のintに分解します。

#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ビットのデータ型を使用するのが最善ですunsigned char

于 2011-11-20T17:48:51.423 に答える
2

整数は32ビット->4バイトです。代わりにunsignedcharを使用します。これは、値0〜255を含む1バイトのみです。

typedefを使用して型の新しい名前を定義すると、使いやすくなります。

typedef unsigned char t_byte;

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

unsignedintはまだ同じサイズです。unsignedcharが必要です

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

ただし、標準では大きくないことを強制していないことを覚えておく必要があります。とにかく大きくなる可能性があります。必要な配置を正確に取得するには、パックされたプラグマを使用する必要がある場合があります。

あなたも使うことができますunsigned char rgb[3]

于 2011-11-20T17:46:42.797 に答える
1

最初のサンプルでは、​​カラーコンポーネントごとに4バイトを割り当てています。8ビットカラーの場合、unsignedcharを使用して1バイトだけを割り当てる必要があります。ここではビットフィールドは必要ありません。

ここでは24ビットピクセルを定義していることに注意してください。32ビットピクセルを使用している場合は、パディングを追加する必要がある場合があります。

于 2011-11-20T17:46:44.700 に答える