带有签名/无符号整数和函数调用的C/C++最佳实践

Iam*_*mIC 32 c c++

我问这个问题有两种不同的语言:C和C++.

调用具有相反整数符号期望的函数时,最佳做法是什么?

例如:

uint32       _depth;                        // uint32 = DWORD
int          depth;

_BitScanForward(&_depth, (uint32)input);    // DWORD, DWORD
depth = (int)_depth;
Run Code Online (Sandbox Code Playgroud)

_BitScanForward期待DWORD(uint32)参数.变量input是int16类型,我需要_depth在我的代码中将结果作为int32 处理.

  1. 我需要关注input如图所示的铸造吗?我知道编译器可能会为我做,但最佳做法是什么?
  2. 声明_depth为int32 是否可以接受,因此避免如后所示将其强制转换为?

注意:

我对编译器的评论是基于经验的.我编写的代码在VS中没有警告编译但在执行时崩溃.原来我正在调用一个incorect width int的函数.所以我不再把这个话题留给编译器了.

编辑:

答案很有帮助,谢谢.让我提炼我的问题.如果没有宽度问题,即函数不期望比传入的更窄的int(obvioulsy将失败),那么依靠编译器来处理符号和宽度差异是否可以?

cht*_*htz 37

我强烈建议将该函数隐藏到自定义包装函数中,该函数与您首选的API一致(并且在此函数中进行正确的显式转换).在使用特定于编译器的函数的情况下,这具有额外的优点,即通过重新实现该包装函数,将它移植到不同的编译器(如果您想要这样做)将更容易.

  • 这是图书馆间操作的一个很好的解决方案.很好的主意! (2认同)

zwo*_*wol 9

从任何比int任何宽度相同或更宽的整数类型更宽的任何整数类型进行显式强制转换非常重要int.如果不这样做,编译器将首先将值转换为int,因为"整数提升"规则,然后转换为目标类型.这几乎总是错误的,如果我们今天从头开始,我们不会这样设计语言,但为了兼容性,我们坚持使用它.

系统提供的typedef等uint16_t,uint32_t,WORD,和DWORD可能是更窄的,更宽的,或相同的尺寸int; 在C++中,你可以使用模板来解决它,但在C中你不能.因此,您可能希望为涉及这些的任何转换编写显式强制类型转换.