【问题标题】:Can the unsigned char type have padding bits and/or unused values?unsigned char 类型可以有填充位和/或未使用的值吗?
【发布时间】:2012-12-05 10:51:04
【问题描述】:

除位域外的所有类型都占用整数个“字节”,sizeof 返回该数字。一个无符号字符占用 1 个“字节”,所以 sizeof(unsigned char) 总是返回 1。对吧?

但是无符号字符是否总是填充一个“字节”,或者 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];
}

【问题讨论】:

  • 请注意,所有规则都是“只要任何 C 程序或用户都知道”。假设您使用的是 9 位字节的硬件,您仍然可以(如果您愿意)编写一个 C 实现,其中CHAR_BIT 为 8,UCHAR_MAX 为 255。但不允许其他类型使用该位unsigned char 不使用,memcmp 必须忽略它,以此类推。这样,就您的 C 实现的用户而言,字节是 8 位,而第 9 位是与您的 C 实现隐藏的底层硬件无关的细节。实际上是模拟。
  • @SteveJessop 好的,但是如果我永远不可能知道这一点,那么作为程序员的我对我的兴趣为零?
  • 如果您是编写 C 实现的程序员,这很有趣 ;-) 或者如果您有一些需要 8 位字节的代码,并且您想在 9 位机器上运行它(反之亦然),很高兴知道就标准而言,仿真是合法的。我承认这是一个小众问题。

标签: c


【解决方案1】:

不,unsigned char 不能有填充位。

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

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

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

【讨论】:

  • 另外,signed char 也不能有填充位 (C11 6.2.6.2/2)。
  • @Lundin 不错,他们在 C11 中明确添加了这句话
猜你喜欢
  • 2022-01-23
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
  • 2016-07-07
  • 1970-01-01
  • 2012-04-13
  • 2020-12-31
  • 1970-01-01
相关资源
最近更新 更多