似乎没有任何库函数可以计算一个类型的位数大小。
我是否正确地认为可以通过以下方式来完成?
#include <climits>
template <typename T>
size_t Size_In_Bits(){
return sizeof(T) * CHAR_BIT;
}
这个操作总是返回可以针对某种类型的位数吗?
似乎没有任何库函数可以计算一个类型的位数大小。
我是否正确地认为可以通过以下方式来完成?
#include <climits>
template <typename T>
size_t Size_In_Bits(){
return sizeof(T) * CHAR_BIT;
}
这个操作总是返回可以针对某种类型的位数吗?
sizeof(T) * CHAR_BIT
返回类型在内存中占用的位数。
然而,位的大小可能会超过整数在数学上可以使用的位数 - (考虑填充位)。
详细信息:整数具有值位、符号位(有符号整数)和可能的填充位。所有这些位都对存储大小做出贡献。
unsigned char
永远不会有填充位。
memcpy
行为相关的非规范文本中有一个单独的提及)。然而,“填充位”仍然足够明确,所以感谢您添加第二个词。 - Lightness Races in OrbitCHAR_BIT
可能大于8,但是“无符号字符不会有填充位”这一说法对于符合C语言规范的编译器是正确的:“对于除了unsigned char
以外的无符号整数类型,对象表示的位应该分为两组:值位和填充位”。参见C17dr § 6.2.6.2 1。也许你可以在stackoverflow上发布你的主张和样例代码,以获得更多信息反馈。 - chux - Reinstate Monica这可以保证为您提供位(存储)大小,但不包括值位数(宽度)。如果类型中有填充位,后者可能会更少。对于无符号类型,您可以通过将-1转换为该类型(以获取类型中可能的最大值)并计算来直接测量值位数。对于有符号类型,可以使用std::numeric_limits<T>::max()
来获取最大值。或者,如果已知特定类型,则可以使用limits.h
或stdint.h
中的xxx_MAX
宏。
std::numeric_limits<T>::max()
。 - user253751