尝试编译此代码时遇到2个错误:
#include <iostream>
using namespace std;
int main() {
int i;
char myCharArray[51] = "This string right here contains exactly 50 chars.";
double myDoubleArray[4] = {100, 101, 102, 103};
char *cp, *cbp;
double *dp, *dbp;
dp = &myDoubleArray[0];
dbp = myDoubleArray;
cp = &myCharArray[0];
cbp = myCharArray;
while ((cp-cbp) < sizeof(myCharArray)) {cp++; dp++; }
cout << "Without cast: " << (dp-dbp) << endl;
cout << " Cast 1: " << ((int *) dp-(int *) dbp) << endl;
cout << " Cast 2: " << ((int) dp-(int) dbp) << endl;
}
我得到的错误是:
错误:从'double *'转换为'int'会丢失精度[-fpermissive]
错误:从'double *'转换为'int'会丢失精度[-fpermissive]
g ++不会让我编译该程序。我问我可以改变什么来使它编译。</ p>
答案 0 :(得分:0)
cast from ‘double*’ to ‘int’ loses precision
就像它可以读取一样简单:存储在int中的位数小于存储在平台上指针中的位数。通常,将int
设置为unsigned int
会有所帮助,因为在大多数平台上,指针可以存储在unsigned int类型中。 unsigned int对于该值还有一位,因为不需要在正面和负面之间做出决定。指针总是积极的。
更好的是使用这些类型的类型来使您的代码更具可移植性。请查看uintptr_t
答案 1 :(得分:0)
你的"Without cast"
行执行指针减法,它产生两个指针之间的差异(以指向类型的大小为单位)。如果两个指针指向同一个数组的元素,或者只是指向它的末尾,那么差异就是它们之间的数组元素的数量。结果是有符号整数类型ptrdiff_t
。
这是一件非常明智的事情。
您的第二行("Cast 1:"
)会在减法之前将指针(类型为double*
)转换为int*
。实际上假装指针指向int
数组的元素,并确定它们指向的int
个对象之间的元素数。你完全不清楚为什么要这样做。
您的第三行("Cast 2:"
)会将两个指针值转换为int
,然后再减去它们。如果int
不足以容纳转换的指针值,那么结果可能是无意义的。如果是,那么在大多数系统上它可能会产生两个以字节为单位的指向对象之间的区别。但我已经研究过系统(Cray T90),其中指针的字节偏移存储在指针值的高3位中。在这样的系统上,你的代码可能产生单词中指向对象之间的距离。或者它可能会产生完全废话。在任何情况下,行为都是未定义的。
从double*
转换为int
的问题不仅在于它失去了精确度(这是您的编译器碰巧抱怨的)。这就是转换的结果并不一定意味着什么。
让代码编译的最简单,也许是最好的方法是删除第二行和第三行。
如果你想要一个除此之外的解决方案,你必须解释你正在尝试做什么。将指针值转换为uintptr_t
可能会避免错误消息,但它不会导致您正在做的事情有意义。