C 无符号字符类型是否可以有填充位和/或未使用的值?

C 无符号字符类型是否可以有填充位和/或未使用的值?,c,C,除位字段外的所有类型都占用整数“字节”,sizeof返回该数字。无符号字符占用1个“字节”,因此sizeof(无符号字符)始终返回1。对吧? 但是,无符号字符是否总是填充一个“字节”,或者字符位是否可以小于“字节”中的位数,或者是否可以小于(字符位幂的2)-1?如果一个无符号字符不能保存它的位数允许的所有值,那么用无符号字符复制其他类型又如何呢 int src = -1, dest; size_t i; for (i = 0; i < sizeof dest; i++) { ((un

除位字段外的所有类型都占用整数“字节”,sizeof返回该数字。无符号字符占用1个“字节”,因此sizeof(无符号字符)始终返回1。对吧?

但是,无符号字符是否总是填充一个“字节”,或者字符位是否可以小于“字节”中的位数,或者是否可以小于(字符位幂的2)-1?如果一个无符号字符不能保存它的位数允许的所有值,那么用无符号字符复制其他类型又如何呢

int src = -1, dest;
size_t i;

for (i = 0; i < sizeof dest; i++) {
  ((unsigned char *) &dest)[i] = ((unsigned char *) &src)[i];
}
intsrc=-1,dest;
尺寸i;
对于(i=0;i
否,
无符号字符
不能有填充位

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

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

(C99,6.5.3.4p3)“当应用于具有类型char、无符号char或有符号char(或其限定版本)的操作数时,结果为1。”


此外,有符号字符也不能有填充位(C116.2.6.2/2)。@Lundin nice,他们在C11中明确添加了一句话。注意,所有规则都是“任何C程序或用户都能知道的”。假设您使用的是9位字节的硬件,您(如果您愿意)仍然可以编写一个C实现,其
CHAR\u bit
为8,
UCHAR\u MAX
为255。但是不允许任何其他类型使用
无符号字符
不使用的位,并且
memcmp
必须忽略它,以此类推。这样,对于C实现的用户来说,字节是8位的,第9位是底层硬件的一个不相关的细节,C实现隐藏了这个细节。实际上,这是一种模拟。@SteveJessop好的,但如果我不可能知道这一点,那么作为一名程序员,我对这一点毫无兴趣?如果你是编写C实现的程序员,这一点很有兴趣;-)或者,如果您有一些需要8位字节的代码,并且希望在9位机器上运行它(反之亦然),那么就标准而言,知道仿真是合法的可能会很好。我承认这是一个利基问题。