我想知道如何以便携方式可靠地确定角色的大小。不能使用AFAIK sizeof(char),因为即使在字节有16位甚至更多或更少的系统上,它也总是为1。
例如,在处理位时,你需要确切知道它有多大,我想知道这段代码是否会给出一个字符的实际大小,而与编译器对它的看法无关。 IMO指针必须由编译器增加到正确的大小,所以我们应该有正确的值。我是对的,或者指针算术可能存在一些隐藏的问题,这会在某些系统上产生错误的结果吗?
int sizeOfChar()
{
char *p = 0;
p++;
int size_of_char = (int)p;
return size_of_char;
}
答案 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位。