C/C++;有符号/无符号整数和函数调用的最佳实践 我问这个问题是用两种不同的语言:C和C++。< /P>
当调用与我们在代码中要求的整数符号期望相反的函数时,最佳实践是什么 例如:C/C++;有符号/无符号整数和函数调用的最佳实践 我问这个问题是用两种不同的语言:C和C++。< /P>,c++,c,C++,C,当调用与我们在代码中要求的整数符号期望相反的函数时,最佳实践是什么 例如: uint32 _depth; // uint32 = DWORD int depth; _BitScanForward(&_depth, (uint32)input); // DWORD, DWORD depth = (int)_depth; _BitScanForward需要DWORD(uint32)参数。变量input是in
uint32 _depth; // uint32 = DWORD
int depth;
_BitScanForward(&_depth, (uint32)input); // DWORD, DWORD
depth = (int)_depth;
_BitScanForward需要DWORD(uint32)参数。变量input
是int16类型,我需要在代码中将结果\u depth
作为int32进行处理
输入
?我知道编者可能会为我做这件事,但最佳实践是什么\u depth
声明为int32,从而避免以后如图所示强制转换它答案很有用,谢谢。让我完善我的问题。如果没有宽度问题,即函数不希望int比传入的更窄(显然会失败),那么依靠编译器处理符号和宽度差异可以吗?这取决于您的使用情况等: 如果我能使用需要的类型,我就使用类型 如果没有: 当您隐式转换可能导致溢出/下溢的数据类型时,编译器应该向您发出警告。因此,我通常会打开这些警告,并将隐式转换更改为显式转换 在这里,我有两种不同的方法: 如果我100%确信我从未超出/低于有符号/无符号int之间的边界,我将使用
静态\u cast
。(通常用于转换不同的API,比如返回int和size\t的size()
当我不确定或可能不确定时,我会使用boost::numeric\u cast
。当您超出边界进行强制转换时,这会引发异常,从而显示何时发生这种情况
例外情况下的方法遵循的做法是,如果出现问题,则硬失败/崩溃/终止,而不是继续使用损坏的数据,然后在其他地方崩溃,或者使用未定义的数据执行其他操作。我强烈建议将该函数隐藏到与首选API一致的自定义包装函数中(并在此函数中执行适当的显式转换)。在使用特定于编译器的函数的情况下,这还有一个额外的优点,即将其移植到不同的编译器会更容易(如果您希望这样做的话),只需重新实现包装器函数。首先,编译器将使强制转换隐式化,并在任何有意义的警告级别上向您发出警告
您执行的两种类型转换都是编译器(或您的同事)无法轻松确定其是否正确的类型转换,因此使用边界测试进行显式类型转换或显式转换是最佳做法。您选择哪种类型取决于您对数据的了解。最安全的方法是检查边界条件。最便宜的方法是简单地进行类型转换(C++中请使用STATICE-CAST非C型铸件)当从小于
int
的任何整数类型转换为宽度等于或大于int
的任何整数类型时,编写显式转换非常重要。如果不这样做,编译器将首先将值转换为int
,因为“整数提升”规则,然后是目标类型。这几乎总是错误的,如果我们今天从零开始,我们不会以这种方式设计语言,但为了兼容性,我们不得不使用它
系统提供了类型代码:
int32_t-1
到uint32_t 0xFFFFFFFF
的值。Reinterpret_cast不会编译为任何指令,它只是源代码级别的值类型更改。如果您有一些设计糟糕的API,例如返回int size()
,但它决不是要返回负数等。总的来说,最好的做法当然是避免任何转换,并始终使用正确的类型,在其他情况下是cast+test。@IamIC the C