8

在 Windows 7 32 位下的 Visual Studio 2010 上,unsigned long 似乎是与 uint32_t 和 uint64_t 不同的类型。请参阅以下测试程序:

#include <stdint.h>
#include <stdio.h>

template<class T, class U>
struct is_same_type
{
    static const bool value = false;
};
template<class T>
struct is_same_type<T, T>
{
    static const bool value = true;
};

#define TO_STRING(arg)        TO_STRING_IMPL(arg)
#define TO_STRING_IMPL(arg)   #arg

#define PRINT_SAME_TYPE(type1, type2) printf("%s (size=%d) %s %s (size=%d)\n", \
    TO_STRING(type1), int(sizeof(type1)), \
    is_same_type<type1, type2>::value ? "==" : "!=", \
    TO_STRING(type2), int(sizeof(type2)))


int main(int /*argc*/, const char* /*argv*/[])
{
    PRINT_SAME_TYPE(uint32_t, unsigned long);
    PRINT_SAME_TYPE(uint64_t, unsigned long);
    return 0;
}

我希望它可以打印

uint32_t (size=4) != unsigned long (size=8)
uint64_t (size=8) == unsigned long (size=8)

(我在 x86_64 Linux 上得到)或

uint32_t (size=4) == unsigned long (size=4)
uint64_t (size=8) != unsigned long (size=4)

当然,假设 long 不超过 64 位。

然而,在 Windows 上,我感到莫名其妙

uint32_t (size=4) != unsigned long (size=4)
uint64_t (size=8) != unsigned long (size=4)

这意味着有两种不同的 32 位无符号类型。这是 C++ 标准允许的吗?或者这是 Visual C++ 编译器中的错误?

4

1 回答 1

10

有两种不同的 32 位无符号类型

是的,有。两者intlong用 32 位表示。

这是 C++ 标准允许的吗?

是的。规范声明(C++11 §3.9.1[basic.fundamental]/2):

有五种标准有符号整数类型:signed charshort intintlong intlong long int。在此列表中,每种类型提供的存储空间至少与列表中它前面的类型一样多。

对于每一种标准有符号整数类型,都存在一个对应的(但不同的)标准无符号整数类型……每一种都与对应的有符号整数类型占用相同的存储量并具有相同的对齐要求

请注意,尽管intlong由相同的位数表示,但它们仍然是不同的类型(因此,例如,在重载决议期间它们的处理方式不同)。

于 2012-07-23T17:46:35.350 回答