可靠地确定char的大小

时间:2013-05-15 10:02:53

标签: c++ c sizeof

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

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

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

3 个答案:

答案 0 :(得分:7)

CHAR_BIT中定义了一个<limits.h>宏来评估其名称的确切含义。


  

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

不,因为指针算术是根据sizeof(T)(指针目标类型)定义的,而sizeof运算符产生的是字节大小。 char始终只有一个字节长,因此您的代码将始终生成NULL指针加一(可能不是数值1,因为NULL不是必需的是0)。

答案 1 :(得分:6)

我认为目前尚不清楚你认为“正确”(或“可靠”,如标题所示)。

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

const int octets_per_char = CHAR_BIT / 8;

无需做指针诡计。而且,诡计很棘手:

在一个16位作为最小可寻址存储器的架构上,地址0x0000 1 另一个 16位地址0x0001处有16位,所以上。

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

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

答案 2 :(得分:2)

一个字符(aka字节)的大小由CHAR_BIT中的宏<limits.h>(或C ++中的<climits>)决定。 sizeof运算符始终以字节为单位返回类型的大小,而不是以位为单位。

因此,如果某个系统CHAR_BIT为16且sizeof(int)为4,则表示该系统上的int有64位。