1

我想知道如何以便携的方式可靠地确定字符的大小。AFAIK sizeof(char) 不能使用,因为这始终产生 1,即使在字节具有 16 位甚至更多或更少的系统上也是如此。

例如,在处理位时,您需要确切知道它有多大,我想知道这段代码是否会给出一个字符的实际大小,而与编译器的想法无关。IMO 指针必须由编译器增加到正确的大小,所以我们应该有正确的值。我对此是否正确,或者指针算法可能存在一些隐藏的问题,这会在某些系统上产生错误的结果?

int sizeOfChar()
{
    char *p = 0;
    p++;
    int size_of_char = (int)p;
    return size_of_char;
}
4

3 回答 3

7

其中定义了一个CHAR_BIT宏,<limits.h>其计算结果完全符合其名称的含义。


IMO指针必须由编译器增加到正确的大小,所以我们应该有正确的值

不,因为指针算术是根据sizeof(T)(指针目标类型)定义的,并且sizeof运算符产生以字节为单位的大小。char总是正好是一个字节长,所以你的代码总是会产生NULL指针加一(它可能不是数值1,因为NULL不需要为 0)。

于 2013-05-15T10:04:59.117 回答
6

我认为尚不清楚您认为什么是“正确的”(或“可靠的”,如标题所示)。

你认为“一个字节是 8 位”是正确的答案吗?如果是这样,对于一个CHAR_BIT16 的平台,那么您当然可以通过计算得到答案:

const int octets_per_char = CHAR_BIT / 8;

无需做指针诡计。此外,诡计也很棘手:

在以 16 位作为最小可寻址内存的架构上,地址 0x0000 1将有 16 位,地址 0x0001 将有另外16 位,依此类推。

因此,您的示例将计算结果 1,因为指针可能会从 0x0000 增加到 0x0001,但这似乎不是您期望它计算的结果。

1为简洁起见,我使用 16 位地址空间,它使地址更易于阅读。

于 2013-05-15T10:11:36.613 回答
2

一个 char (又名 byte )的位大小由(或C++ 中)中CHAR_BIT的宏确定。运算符总是以字节而不是位为单位返回类型的大小。<limits.h><climits>sizeof

因此,如果在某个系统CHAR_BIT上是 16 并且sizeof(int)是 4,这意味着 int 在该系统上具有 64 位。

于 2013-05-15T10:07:01.730 回答