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)

これは、2 つの異なる 32 ビット符号なし型があることを意味します。これは C++ 標準で許可されていますか? それとも、これは Visual C++ コンパイラのバグですか?

4

1 に答える 1

10

2 つの異なる 32 ビット符号なし型があります。

はい、あります。intとはどちらもlong32 ビットで表されます。

これは C++ 標準で許可されていますか?

はい。仕様には次のように記載されています (C++11 §3.9.1[basic.fundamental]/2):

標準の符号付き整数型には、 、 、 、 、および の 5signed charshort intintありlong intますlong long int。このリストでは、各タイプは、少なくともリスト内の前のタイプと同じ量のストレージを提供します。

標準の符号付き整数型ごとに、対応する (ただし異なる) 標準の符号なし整数型が存在します...それぞれが同じ量のストレージを占有し、対応する符号付き整数型と同じアライメント要件を持ちます。

intとは同じビット数で表されるという事実にもかかわらずlong、それらはまだ異なる型であることに注意してください (たとえば、オーバーロードの解決時に異なる方法で処理されます)。

于 2012-07-23T17:46:35.350 に答える