8

ビット フィールドを除くすべての型は整数の「バイト」を占有し、sizeof はその数値を返します。unsigned charは 1 "バイト"を占有するため、sizeof(unsigned char) は常に 1 を返します。

しかし、unsigned char は常に「バイト」を埋めますか、それとも CHAR_BITS が「バイト」のビット数よりも少ないか、または UCHAR_MAX が (2 の CHAR_BITS 乗) - 1 より少ない可能性がありますか? unsigned char がそのビット数が許可するすべての値を保持できない場合、unsigned char を使用して他の型をコピーするにはどうすればよいですか?

int src = -1, dest;
size_t i;

for (i = 0; i < sizeof dest; i++) {
  ((unsigned char *) &dest)[i] = ((unsigned char *) &src)[i];
}
4

1 に答える 1

9

いいえ、unsigned charパディング ビットを持つことはできません。

(C99、6.2.6.2p1) 「unsigned char 以外の符号なし整数型の場合、オブジェクト表現のビットは、値ビットとパディング ビットの 2 つのグループに分割されます (後者のいずれかが存在する必要はありません)。」

はい、sizeof (unsigned char)であることが保証されています1

(C99、6.5.3.4p3) 「char、unsigned char、または signed char (またはその修飾バージョン) 型を持つオペランドに適用すると、結果は 1 になります。」

于 2012-12-18T09:03:36.100 に答える