这个问题是由以下(简化)示例激发的。
Consider the following code:
void f(unsigned int x) { }
int main()
{
int z = 3;
if (z > 0)
for (unsigned int i = 0; i < z; ++i)
f(i);
return 0;
}
在启用所有警告的情况下编译时,编译器将发出
warning: comparison of integer expressions of different signedness: ‘unsigned int’ and ‘int’
这显然不是一个真实的的问题,因为代码显式地检查for循环中的上限是否为正。
消除该警告的一种方法是显式static_cast
z:
int main()
{
int z = 3;
if (z > 0)
for (unsigned int i = 0; i < static_cast<unsigned int>(z); ++i)
f(i);
return 0;
}
至少在这个简化的例子中,两个代码编译成相同的汇编程序,在godbolt上可以看到。实际上,我不希望从int到unsigned int的转换会导致任何指令,因为两种类型都是stored with the same number of bits。
这就引出了一个问题:static_cast
什么时候会导致没有编译指令?static_cast
在具有相同位数的整数之间是否总是这样?
1条答案
按热度按时间kb5ga3dv1#
当你没有强制转换时,编译器会为你添加一个转换,所以它们都编译成相同的机器码是有意义的,但是当它是隐式的时,很可能你没有预料到甚至没有意识到(只要在StackOverflow上搜索一下人们试图比较
vector.size()
和-1
的案例数量)。所以你的编译器会生成一个警告,要求你确认这是你真正想要的。