【发布时间】: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