【问题标题】:How does casting between Cs default int type and <stdint.h>'s intXX_t types work?Cs 默认 int 类型和 <stdint.h> 的 intXX_t 类型之间的转换如何工作?
【发布时间】:2021-12-09 07:10:31
【问题描述】:

我正在使用 C 中的常规旧 int 类型在具有大量预先存在的代码的代码框架中工作。但是,我需要编写的代码要求我使用固定长度的 int32_t。但是,我需要能够从int 的常规代码中获取输入,并输出到也只是常规int 的变量。从int32_t 到int 的转换是否保留了变量的值,或者它的特定数据表示(在这种情况下,我可能需要移位以保留该值)。相反,从int 转换到int32_t 会带来任何复杂性吗?任何答案都将不胜感激,尤其是任何一般和具体解释 stdint 库的转换约定的答案。

【问题讨论】:

  • 如果在这两种类型的范围内,该值将被保留。

标签: c stdint


【解决方案1】:

Cs 默认int 类型和 的intXX_t 类型之间的转换如何工作?

当intXX_t 和int 的大小、范围和有效类型相同时,不会真正发生“工作”。

当intXX_t 的范围大于int 时,所有值都保留在新类型中。高位是符号扩展。

当intXX_t 的范围比int 窄时,超出范围的值会以实现定义的方式进行转换。这是非常普遍类似环绕的mod(低位相同)

当intXX_t 与int 具有相同的范围时,类型可能不同,但通常相同。在选择代码中(如_Generic),区别很重要。


int 有各种大小和编码。

  • 32 位(2 的补码):这很常见,尤其是在台式计算机上。

  • 16 位(2 的补码):这在小型嵌入式处理器中很常见。

  • 其他:包括非 2 的补码、某些 64 位图形处理器上的 64 位、旧机器或深奥机器上的一些非 2 次幂。对于 OP 而言,只需知道其他人的存在,但 非常 OP 不太可能需要将代码移植到此类机器或从此类机器移植代码。


从int32_t 转换为int 是否会保留变量的值,或者它的特定数据表示(在这种情况下,我可能需要进行位移以保留该值)。

不需要位移。

  • 32 位(2 的补码):将int32_t 转换为int 不会丢失任何值信息。在某些情况下,可能会发生 type 更改。 int32_t 可能被定义为long 的类型,但int32_t, int 更可能是完全相同的类型。

  • 16 位(2 的补码):将 int32_t 转换为 int 会丢失信息,因为范围要小得多。在这样的机器上,最好将int32_t 转换为long。


相反,从int 转换为int32_t 会带来任何复杂性吗?

  • 32 位(2 的补码):不太可能有任何问题。

  • 16 位(2 的补码):有些情况值得审查,因为 int32_t 更宽且占用更多空间。


编写良好的代码不太可能导致问题,但很多代码并未考虑可移植性。

对于 OP,我建议创建宏,而不是直接转换。由于新的工作要求,这将有助于跟踪对代码库的更改。此外,可以很容易地使用替代方案来调试范围缩小/增加问题。

// Use names per your coding style
#define inttoint32(i) ((int32_t) (i))
#define int32toint(i32) ((int) (i32))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多