C ++标准并不需要整数类型的精确大小,这有时会导致非常意外的结果。然后,一些聪明的人为具有正确64位宽度的类型引入了<cstdint>
包含(可选)typedef的头文件,如int64_t
。这不是想要的。
是否有(可能是可选的)整数类型,其属性sizeof(mysterious_type) == 2
用于定义的任何系统?
推理:我试图弄清楚系统的结束。为此,在审查了这个板上的许多问题之后,我只想定义一个大小为2的整数类型,给它分配一个并检查这样的结束:
enum endianess { LITTLE_ENDIAN, BIG_ENDIAN };
typedef utwowitdhtype test_t; // some unsigned type with width 2
endianess inspectSystem() {
static_assert(sizeof(twowitdhtype) == 2, "twowitdhtype is not size 2??!?!!");
test_t integral = 0x1;
return *reinterpret_cast<char*>(&integral) == 0 ? BIG_ENDIAN : LITTLE_ENDIAN;
}
虽然这是为什么我会对这种类型感兴趣的原因,但找到这样的类型不是为了解决问题,而是出于好奇。
答案 0 :(得分:6)
如果你的机器上有char
尺寸!= 8位,你将有更大的可移植性问题你将不得不解决 - 这样做更简单{ {1}}比虚假可移植性更奇怪的东西 - 如果你不能测试它,你怎么能说你做对了?
虽然找到endianess它根本没用,但你可以通过使用类型特征来获得这种类型。
static_assert(CHAR_BIT == 8, "assuming 8-bit chars")
如果此类型不存在,#include <type_traits>
template<typename T>
struct Identity
{
typedef T type;
};
template<typename... Args>
struct ShortTypeFinder;
template<>
struct ShortTypeFinder<>
{
};
template<typename Head, typename... Tail>
struct ShortTypeFinder<Head, Tail...>
{
typedef typename std::conditional<sizeof(Head) == 2, Identity<Head>, ShortTypeFinder<Tail...>>::type::type type;
};
typedef ShortTypeFinder<short, int, long, long long>::type integral_type_with_sizeof_two;
int main()
{
integral_type_with_sizeof_two x = 0;
static_assert(sizeof x == 2, "sizeof(x) must be 2");
static_assert(std::is_same<integral_type_with_sizeof_two, short>::value, "it's short on my machine");
}
将无法编译。
答案 1 :(得分:2)
只要一个字节由8位组成,sizeof(int16_t)
将始终为2.还有一些类型需要至少16位大小和其他一些有趣的类型。