我正在寻找一种将 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/