【问题标题】:Signed and unsigned machine word types有符号和无符号机器字类型
【发布时间】:2012-04-22 06:48:53
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 为什么需要机器字大小的东西?或许您应该明确您的应用程序对代码施加的实际约束,我们可以讨论如何满足这些约束,而不用试图用机器语言来构建它。
  • 因为它需要适合索引数组,跟踪分配的内存块的大小等等。
  • 如果您的约束是它需要足够大以处理任意地址以及它们之间的差异,那么 (u)intptr_t 和 ptrdiff_t 等似乎很清楚。是唯一适合使用的类型。这就是他们的目的。
  • @rwallace - 在 286 上,int 仍然大到足以容纳内存段的大小,即使地址更大。

标签: c integer unsigned signed


【解决方案1】:

您可以使用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。

【讨论】:

  • ssize_t 带有 POSIX 而不是 C,所以不清楚它是否总是被定义,特别是在嵌入式系统上可能会有问题,我猜。
  • 是的,乍一看这似乎是正确的解决方案,但乍一看它似乎不够便携。
【解决方案2】:

为什么不直接使用intunsigned int

C99 6.2.5/6 类型

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

【讨论】:

  • int 的唯一规范要求是它至少为 16 位,不是吗?
  • 因为在某些平台上,int 与机器字长不对应(例如在 64 位 Windows 上,int 仍然是 32 位)。
  • 一个 int 在嵌入式处理器上有时是 32 位,而 32 位太大了;例如,avr-gcc 在 8 位处理器上具有 32 位整数。
【解决方案3】:

我已经确定 zmccord 是正确的,intptr_tuintptr_t 是保证可用的类型,并且清楚明确地足够了。如果特定变量需要小于特定平台的变量,则可以使用所需的特定大小声明它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-15
    • 2019-06-10
    • 1970-01-01
    • 2014-06-21
    • 2014-02-01
    • 2017-04-05
    • 1970-01-01
    • 2014-01-28
    相关资源
    最近更新 更多