C 有符号和无符号机器字类型

C 有符号和无符号机器字类型,c,integer,unsigned,signed,C,Integer,Unsigned,Signed,我需要一对标准整数类型,有符号和无符号,它们对应于(对)机器字大小的合理解释,并且保证彼此的大小相同 在具有干净地址模型的平台上,intptr\u t和uintpr\u t符合要求,因此使用它们当然是可能的 然而,有一种可能性是,所讨论的代码可能需要在各种嵌入式系统上运行。我猜其中一些仍然使用286风格体系结构的CPU,其中最大的有效整数类型小于指针-如果不是,请纠正我-但如果是,那么就有理由使用较小的整数类型 较小的整数类型可能对应于size\u t和ptrdiff\u t——但这些类型是否保

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

在具有干净地址模型的平台上,
intptr\u t
uintpr\u t
符合要求,因此使用它们当然是可能的

然而,有一种可能性是,所讨论的代码可能需要在各种嵌入式系统上运行。我猜其中一些仍然使用286风格体系结构的CPU,其中最大的有效整数类型小于指针-如果不是,请纠正我-但如果是,那么就有理由使用较小的整数类型

较小的整数类型可能对应于
size\u t
ptrdiff\u t
——但这些类型是否保证彼此大小相同?我确实需要能够在有符号和无符号类型之间来回转换而不会丢失


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

为什么不直接使用
int
unsigned int

C99 6.2.5/6类型

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


您可以使用
size\u t
ssize\u t.

更新:

这当然是
typedef
的作用,因此:

typedef size_t uword_t;
typedef ssize_t word_t;
如果您遇到一个系统具有C99
size\u t
,但没有Posix
ssize\u t
,则您可以:

  • 有条件地为该系统定义一次单词,或-
  • 也许您可以为该系统提供自己的
    。它可以在充分了解本地环境的情况下定义
    ssize\t
    ,还可以清除您遇到的任何其他缺失的位置

  • 我认为zmccord是正确的,
    intptr\u t
    uintpr\u t
    是保证可用的类型,并且明确无误地足够了。如果某个特定变量需要小于某个特定平台的变量,则可以使用它所需的特定大小来声明。

    int的唯一规范要求是它至少为16位,不是吗?因为在某些平台上,int与机器字大小不对应(例如,在64位Windows上,int仍然是32位)。在32位太大的嵌入式处理器上,int有时是32位;例如,avr gcc在8位处理器上有32位int。为什么需要机器字大小的东西?也许您应该明确应用程序对代码的实际限制,我们可以讨论如何满足这些限制不要试图用机器字来构建它。因为它需要适合于索引数组、跟踪分配内存块的大小等等。如果您的限制是它需要足够大以处理任意地址以及它们之间的差异,那么(u)似乎很清楚intptr_t和ptrdiff_t等是唯一适合使用的类型。这就是它们的用途。@rwallace-在286上,int
    int
    仍然足够大,可以容纳内存段的大小,即使地址更大。
    ssize_t
    与POSIX一起提供,而不是与C一起提供,因此不清楚它是否总是被定义的,特别是在Embedded上我想,d系统可能会有问题。是的,乍一看,这似乎是正确的解决方案,但乍一看,它似乎没有足够的可移植性。