保证大小为2的类型?

时间:2015-06-16 14:47:55

标签: c++ types c++14

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;
}

虽然这是为什么我会对这种类型感兴趣的原因,但找到这样的类型不是为了解决问题,而是出于好奇。

2 个答案:

答案 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位大小和其他一些有趣的类型。

http://en.cppreference.com/w/cpp/types/integer