gpt4 book ai didi

c++ - 这个指针值不能转换为整数的规则是什么?

转载 作者:行者123 更新时间:2023-11-30 01:36:00 25 4
gpt4 key购买 nike

我只想知道为什么不允许这样做的规则是什么,因为给我的原因并不十分清楚。

#include <iostream>

int main()
{
float* pointer = new float;
long long bigNumber = 1;
int a = bigNumber; // Allowed
short b = bigNumber // Allowed
a = (int)pointer; // Not allowed
a = (long long)pointer; // Allowed

return 0;
}

我用“不允许”标记的行给出了一个错误。在 Visual Studio 中它说:

'type cast': cannot convert from 'float *' to 'int'

这很清楚,但没有解释原因。但是,当我在 onlinegdb 在线 C++ 编译器上编译代码时,我收到该行的以下错误消息:

error: cast from ‘float*’ to ‘int’ loses precision [-fpermissive]

link

我试过 Ideone、cppbuzz 和 jdoodle 在线编译器,我得到了同样的信息。所以它说的原因是它是不允许的,因为它会丢失精度。但是,当我将 long long 分配给 int 或 short 时,这也会导致精度损失,但它不会给我一个错误,这让我认为它打破了另一个规则,而不仅仅是它失去了精度。

我看过这个question ,其中最上面的答案说这是一个没有显式转换的不允许的转换,但请注意这是一个 C,而不是 C++ 问题。事实上,如果我没有明确地将指针转换为 int,我会收到不同的消息,而是:

error: invalid conversion from ‘float*’ to ‘int’ [-fpermissive]

没有提到精度损失。

如果我将 Visual Studio 设置为 32 位,该行不再给出错误,因为指针大小是 32 位,在我的例子中也是一个 int。

我的问题是防止这种情况发生的规则是什么?这不仅仅是精度损失问题,因为在将 long long 分配给 int 或 short 时它会导致精度损失。

最佳答案

只有当映射是单射的时,C++ 标准才允许从指针类型到整数类型的reinterpret_cast。在您的实现中,int 似乎不够大(可能是因为 int 是 32 位而指针是 64 位)。因此不允许强制转换。

关于c++ - 这个指针值不能转换为整数的规则是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52671630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com