我遇到了一个 C++ 片段:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<float> f(2);
float *p1 = f.data(), *p2 = p1 + 1;
cout << (p2 - p1) / sizeof(float) ;
return 0;
}
我预期的输出是 0.25,但有趣的是它显示的是 0。
如果我尝试将其转换为浮点数然后打印它,输出仍为 0。
cout << static_cast<float>((p2 - p1) / sizeof(float)) ;
发生了什么事?
g++ --version
给出以下内容:
g++(Debian 13.1.0-6)13.1.0 版权所有 (C) 2023 自由软件基金会, Inc. 这是免费软件;请参阅复制条件的来源。没有 保修单;甚至不是为了适销性或特定用途的适用性。
在表达式 (p2 - p1) / sizeof(float) 中,p2 - p1 的计算结果为 1,这是两个指针之间的差值。然而,在大多数系统上,sizeof(float) 为 4,因为 float 通常在内存中占用 4 个字节。
因此,(p2 - p1) / sizeof(float) 实际上是 1 / 4,在整数除法中结果为 0,而不是您可能期望的 0.25。
当您尝试使用 static_cast((p2 - p1) / sizeof(float)) 将其转换为浮点数时,您将整数除法 0 的结果转换为浮点数,该结果仍为 0。
为了得到您期望的结果,您需要在进行除法运算之前确保除法的至少一个操作数是浮点数。实现此目的的一种方法是在执行除法之前将其中一个操作数转换为浮点数:
cout << static_cast<float>(p2 - p1) / sizeof(float);
这样,(p2 - p1) 首先会被转换为浮点数,得到 1.0,然后除以 sizeof(float),得到 0.25。
两个类型指针之间的区别是相对于类型的距离。所以在你的表达中,
(p2-p1)
是1
,而不是1*sizeof(float)
。因此,将其除以 sizeof(float)
将得到 0
。