2

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

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

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

  1. 32 位
  2. 64 位

我想写一些类似的东西:

typedef int instruction32bit;

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

3 回答 3

7

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

于 2013-01-11T22:56:41.903 回答
3

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

   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 的每个编译器/操作系统(或其组)模型,您可能需要一个特殊的#ifdef.

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

正如 Carl Norum 在评论中指出的那样,在许多情况下,#ifdef可能可以转换为 a #if,然后使用泛型类型,例如intand long

于 2013-01-11T23:05:15.803 回答
0

使用uint_least32_tuint_least64_t。固定大小的类型uint32_t不会uint64_t存在于没有它们描述的确切大小的系统上。

于 2013-01-12T12:00:09.140 回答