签名和未签名的机器字类型

时间:2012-04-22 06:48:53

标签: c integer unsigned signed

我需要一对有符号和无符号的标准整数类型,它们对应于机器字大小的(合理解释),并且保证彼此大小相同。

在具有干净地址模型的平台上,intptr_tuintptr_t符合要求,因此使用它们肯定是可能的。

但是,有问题的代码可能需要在各种嵌入式系统上运行。我猜其中一些仍然使用具有286风格架构的CPU,其中最大的有效整数类型小于指针 - 请纠正我,如果不是这样 - 但如果是,那么有一个案例要做使用较小的整数类型。

那个较小的整数类型可能会对应size_tptrdiff_t - 但这些类型是否保证彼此相同?我确实需要能够在签名和无符号类型之间来回转换而不会丢失。

还有什么我应该考虑的吗?

3 个答案:

答案 0 :(得分:2)

您可以使用size_tssize_t.

更新

这肯定是typedef的用途,所以:

typedef size_t uword_t;
typedef ssize_t word_t;

如果您遇到过具有C99 size_t而不是Posix ssize_t的系统,那么您可以:

  1. 有条件地为该系统定义word_t - 或 -
  2. 也许为该系统提供您自己的<unistd.h>。它可以在充分了解当地环境的情况下定义ssize_t,并清理您遇到的任何其他缺失的Posixness。

答案 1 :(得分:1)

为什么不使用intunsigned int

C99 6.2.5 / 6类型

  

对于每个有符号整数类型,有一个相应的(但不同的)无符号整数类型(用关键字unsigned指定)使用相同数量的存储(包括符号信息)并且具有相同的对齐要求

答案 2 :(得分:0)

我认为zmccord是正确的,intptr_tuintptr_t是保证可用的类型,并且明确且毫不含糊。如果特定变量需要小于特定平台的变量,则可以使用所需的特定大小声明它。