跨平台64位类型

时间:2013-01-11 22:54:55

标签: c++ visual-studio-2010 gcc sizeof bit

每个操作系统(32/64位)是否有64位类型,并且每个编译器的大小为64?

同样的问题也适用于32位类型。 (它应该是int?)

问题的根源是:我正在实施有两种指令的系统:

  1. 32位
  2. 64位
  3. 我想写一些类似的东西:

    typedef int instruction32bit;
    
    typedef long long instruction64bit //it is not correct some system have sizeof(long long) = 128 
    

3 个答案:

答案 0 :(得分:7)

您正在寻找int64_tint32_t,或未签约的朋友uint64_tuint32_t。包括cinttypescstdint

答案 1 :(得分:3)

如果您希望您的代码真正可移植,那么您可能想要键入自己的类型,并使用例如

   typedef int32_t instruction32bit;
   typedef int64_t instruction64bit;

这将在大部分时间内工作,但如果它不适用于特定的系统/编译器/无论什么,你可以添加这样的东西:

 #ifdef SOMEDEFINE
   typedef long long int instruction64bit;
   typedef int instruction32bit;
 #else
   typedef int32_t instruction32bit;
   typedef int64_t instruction64bit;
 #endif

当然,对于不支持int32_t和int64_t的每个编译器/ OS(或其组)模型,您可能需要一个特殊的#ifdef

这正是所有真正可移植的代码所做的,因为无论您发现“几乎所有编译器都执行X”,如果您的代码足够流行,总会有人想要使用“Bob的编译器”编译代码项目“没有这个功能。当然,另一件事是让那些使用“Bob的编译器”的人编辑typedef本身,而不是接受“For Bob的编译器,你需要这个...”补丁,它不可避免地会被你发送。

正如Carl Norum在评论中指出的那样,#ifdef在很多情况下可能会转换为#if,然后使用int和{{1}这样的泛型类型}}。

答案 2 :(得分:0)

使用uint_least32_tuint_least64_t。固定大小的类型uint32_tuint64_t将不存在于没有他们描述的确切大小的系统上。