unsigned char类型可以有填充位和/或未使用的值吗?

pot*_*bie 6 c

除位字段之外的所有类型都占用整数个"字节",而sizeof返回该数字.unsigned char 占用 1"byte",因此sizeof(unsigned char)总是返回1.对吗?

但是,无符号字符是否总是填充 "字节",或者CHAR_BITS是否小于"字节"或UCHAR_MAX中的位数小于(2到CHAR_BITS的幂) - 1?如果unsigned char不能保存其位数允许的所有值,那么使用unsigned chars复制其他类型的工作原理如何?

int src = -1, dest;
size_t i;

for (i = 0; i < sizeof dest; i++) {
  ((unsigned char *) &dest)[i] = ((unsigned char *) &src)[i];
}
Run Code Online (Sandbox Code Playgroud)

oua*_*uah 8

不,unsigned char不能有填充位.

(C99,6.2.6.2p1)"对于无符号字符以外的无符号整数类型,对象表示的位应分为两组:值位和填充位(不需要任何后者)."

是的,sizeof (unsigned char)保证是1.

(C99,6.5.3.4p3)"当应用于具有char,unsigned char或signed char(或其合格版本)类型的操作数时,结果为1."

  • 此外,signed char也不能有填充位(C11 6.2.6.2/2). (4认同)
  • @Lundin 不错,他们在 C11 中明确添加了这句话 (2认同)