【问题标题】:Reliably determine the size of char可靠地确定char的大小
【发布时间】:2013-05-15 10:02:52
【问题描述】:

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

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

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

【问题讨论】:

  • CHAR_BITCHAR_MAX 是简单的可移植方法。
  • 还有一个sizeof 运算符,仅供参考sizeof(char)
  • sizeof 并不总是有用的,因为在某些情况下您需要知道 char 是 8 位还是其他。 Sizeof 不提供此信息。
  • @abasu sizeof(char) == 1 根据定义。即使(在某些机器上)char 可以容纳多个字节。我知道,这很奇怪。
  • @leemes,是的,这就是为什么我想知道如何可靠地获取位数信息,并想出了我的代码。 :) 好吧,我现在放弃它并使用limits.h 中的定义。我一直不明白为什么标准没有为您需要的情况添加至少具有固定位的数据类型。

标签: c++ c sizeof


【解决方案1】:

<limits.h> 中定义了一个 CHAR_BIT 宏,其计算结果与其名称所暗示的完全一致。


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

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

【讨论】:

  • 天知道,因为我不知道,但它不能回答我的问题,即这段代码是否能够可靠地返回正确的结果,而与任何定义无关。
  • 是的,当然是我的代码。我假设系统宏应该是有效的。 :)
  • @Devolus 您的代码很可能会返回 1,无论字符中的位数如何。
  • @Devolus 已更新。不会的。
【解决方案2】:

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

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

const int octets_per_char = CHAR_BIT / 8;

不需要做指针欺骗。而且,诡计很棘手:

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

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

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

【讨论】:

  • 其实这正是我想知道的。我希望内存地址总是 8 位的块,但当然这个假设对于某些系统可能是错误的,因此我的问题。我知道有些旧机器有 12 位或其他,所以在这样的系统上,指针运算可能也会出错。
  • 内存地址定义了CHAR_BIT 和字符的实际大小,而不是相反。 char 是适合一个“地址槽”的数据单位。
【解决方案3】:

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

所以如果在某些系统上CHAR_BIT 是 16 而sizeof(int) 是 4,这意味着 int 在该系统上具有 64 位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多