sizeof(T) * CHAR_BIT是否保证位大小?

5

似乎没有任何库函数可以计算一个类型的位数大小。

我是否正确地认为可以通过以下方式来完成?

#include <climits>

template <typename T>
size_t Size_In_Bits(){
    return sizeof(T) * CHAR_BIT;
}

这个操作总是返回可以针对某种类型的位数吗?


2
什么是“可以针对类型定位的位”? - user253751
1
@chux 我已将C标签更改为C ++。虽然,我想知道这两种语言之间是否有任何区别。上述实现可以改为使用limits.h的C宏。 - Trevor Hickey
有信心地说,C/C++之间没有大小差异。 - chux - Reinstate Monica
@immibis 是的,我想那可能有误导性。"在内存中实际存储并可以通过位操作更改的位数。" - Trevor Hickey
2个回答

3

sizeof(T) * CHAR_BIT 返回类型在内存中占用的位数。

然而,位的大小可能会超过整数在数学上可以使用的位数 - (考虑填充位)。


详细信息:整数具有值位、符号位(有符号整数)和可能的填充位。所有这些位都对存储大小做出贡献。

unsigned char 永远不会有填充位。


1
称其为“填充”非常误导。在C和C++中,填充意味着其他东西。 - Lightness Races in Orbit
1
@BarryTheHatchet C规范§6.2.6.2的第2条将额外的位称为“填充位”。 在C和C ++中,此处使用的“填充”不会引起极大的误导,因为它在2个上下文中使用:如上所述的位和结构体的填充字节。 答案重新组织为称它们为“填充位”,以帮助区分“填充字节”。 无论如何,根据语言规范,这仍然是一种填充形式。 - chux - Reinstate Monica
也许C规范是这样的,但C++规范并不是这样的(除了在§29.6.5下与memcpy行为相关的非规范文本中有一个单独的提及)。然而,“填充位”仍然足够明确,所以感谢您添加第二个词。 - Lightness Races in Orbit
@BarryTheHatchet 注意,在回答时,该帖子被标记为[C]而不是[C++]。 OP对C/C++持矛盾态度,但使用了C++的“template”,后来将标签从C更改为C++。 - chux - Reinstate Monica
“unsigned char永远不会有填充位”--不正确。至少存在一种架构,即模拟设备SHARC,具有两个不同大小的存储器总线:32位(数据)和48位(代码)。 根据分配无符号字符的段,它具有32或48位--而不是8位。 因为处理器的主要寄存器都有32位,所以在访问代码存储段中的无符号字符数组时,每个无符号字符有16个无法使用的填充位--例如在密集的内存映射中看到。我们编写了一个字符串常量类来克服浪费的内存。 - UnePierre
@UnePierre 说CHAR_BIT可能大于8,但是“无符号字符不会有填充位”这一说法对于符合C语言规范的编译器是正确的:“对于除了unsigned char以外的无符号整数类型,对象表示的位应该分为两组:值位和填充位”。参见C17dr § 6.2.6.2 1。也许你可以在stackoverflow上发布你的主张和样例代码,以获得更多信息反馈。 - chux - Reinstate Monica

3

这可以保证为您提供位(存储)大小,但不包括值位数(宽度)。如果类型中有填充位,后者可能会更少。对于无符号类型,您可以通过将-1转换为该类型(以获取类型中可能的最大值)并计算来直接测量值位数。对于有符号类型,可以使用std::numeric_limits<T>::max()来获取最大值。或者,如果已知特定类型,则可以使用limits.hstdint.h中的xxx_MAX宏。


关于“将(无符号)-1转换为类型并计数”的好答案以及“无法测量有符号类型中值位的数量”的内容。 - chux - Reinstate Monica
1
如果您知道它是哪种类型,或者您可以使用std::numeric_limits<T>::max() - user253751
哦,抱歉,这个问题标记的是C++而不是C。在这种情况下,我的答案有些错误... - R.. GitHub STOP HELPING ICE
做了一些更改,希望现在更好了。 - R.. GitHub STOP HELPING ICE
我以为下溢是未定义行为?或者当你用负1初始化无符号数时,情况会有所不同吗? - Trevor Hickey
@TrevorHickey:不会发生下溢。将整数转换为无符号类型是明确定义的,并且按照模TYPE_MAX+1进行缩减。 - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接