c - uint32_t 到 int32_t 的快速不安全转换

标签 c type-conversion unsigned

我正在寻找一种将 uint32_t 转换为 int32_t 的快速方法。我可以假设所有数字都小于 2^31-1 并且不需要担心代码中此时的溢出。我可以假设 int32_t 的符号位是 uint32_t 的最大数字吗?在编码方面,我可以将指向 uint32_t 值的指针视为指向 int32_t 值的指针吗:以下代码是有效的独立于平台的 C 代码吗,最后一条语句是真的? (在我的 Mac 上和 linux 上的英特尔编译器上都是如此)

uint32_t ui = 3;
int32_t  *i = &ui;

(int32_t)ui == *i;

最佳答案

如果您希望速度快,并且不担心溢出,则根本不需要做任何花哨的事情。如果你只是写

i = ui;

任何理智的编译器最多会发出一条赋值指令,尽管它可能会警告您类型不匹配和溢出的可能性。如果你写

i = (int32_t)ui;

任何理智的编译器都会发出完全相同的赋值指令,并且会吞下它对类型不匹配的怀疑(即警告您)。

没有必要涉及指针别名或类型双关——这只会混淆代码,并可能降低其可靠性或效率。

如果您担心转换以及符号位的位置等问题,您真的不必:

  • 在二进制补码运算中,不需要转换,除非它是为了检测溢出并抛出异常。在一个补码和符号量级中,也不需要转换,同样,除非检测到溢出并抛出异常。

  • 尽管不做出与机器相关的假设是明智的,但出于所有意图和目的,您可以假设您的代码将在二进制补码机器上运行。 (它们几乎是通用的。)

  • 即使需要转换,也不会比直接赋值慢多少。

  • 通过在 C 中编写一个简单的赋值(而不是一些指针旋转),您可以确保,即使以某种方式需要进行一些转换,您的编译器也会处理它。

关于c - uint32_t 到 int32_t 的快速不安全转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50774057/

相关文章:

c++ - 为什么在这种情况下没有调用最合适的构造函数?

python - Python2中如何将字符串转换为字节?

c - 如何将宏的 2 个参数拆分并重新整理为 2 个单独的宏?

c - 如何在 C 中接受 Char 输入?

c - 使用 C 语言在 Mac OS X 中获取主目录

创建一个迭代程序来估计多项式的根

java - 如何从 int 转换为 String?

将数组转换为无符号整数

c - 如果一个变量被声明为无符号,那么与其相关的函数也必须是无符号的吗?

在 C 中比较两个相等的 unsigned long 计算结果为 false