C++ - 强制类型转换变量及其处理方式是什么?

3

我对这个问题很好奇,也许我完全错了,但是当你将一个类型转换为另一个类型时,它是否会查看内存/值,然后将该内存/值视为新类型?

例如:

char Letter = 'A';
int iLetter = static_cast<int>(Letter);
//iLetter is 65

如果这是正确的,它会查看“Letter”的内存位置/值,然后将该值更改为您需要转换成的值吗?我通过将所有值想象成整数,然后被转换为char / struct / class等来形成这个理论。
希望这是一个完整的问题,我只是想深入了解如何使用值/信息进行类型转换以将其转换为新值等。

嗯,如果不看它,将某物转换为其他东西会有些困难,因此在这里显然会“查看”Letter的值。如果你想知道Letter的值是否在这里被改变了,答案是“不”。 - Sam Varshavchik
不是如果“Letter”的值被更改,而是我想知道如何使用“casting”从“Letter”中获取int值。如果有意义的话,抱歉如果我没有表达清楚。 - Trevin Corkery
Cast 告诉 编译器 如何存储结果。= 运算符在运行时进行查看。 - user207421
@SamVarshavchik,“looking”现象用非常简单的术语解释了 :-D ... 感谢OP和您为学习带来的快乐。 - blackpen
请记住,char 是一个小整数,除非原始值实际上超出了目标类型的范围,否则在这样的转换中不会改变值。 - M.M
"Letter" 也是65,只是被存储在一个可以表示 "char" 数据类型的位置。在 x86 机器上,行 int iLetter = static_cast<int>(Letter)int iLetter = Letter 都可能生成一个 movsbl 指令 (https://godbolt.org/g/b3cBw5)。 - kfsone
3个回答

3
在进行值转换时(与指针或引用相反),编译器会从被转换的值构建一个新值,而不是将现有位置解释为新类型。具体来说,代码查看Letter的值,它是一个char,并通过使用C++整数转换规则char扩展为int以构造一个iLetter。这可能包括有符号类型的符号扩展,因此负的signed char将变成负的int。另一方面,当您转换指针时,同一位置将被解释为新类型。

请注意:指针转换的情况比概述更为复杂,例如多重继承转换、不对齐转换等。 - M.M
同意上面的观点;顶部的简要描述实际上只适用于重新解释转换。最好重新表述一下。 - Nir Friedman

1
在您的情况下,static_cast会创建一个新类型的临时变量,然后将其设置在iLetter中。
编辑: 这意味着static_cast不会改变主变量的类型,只是读取它。最后,它不会直接将转换后的值放入iLetter中。它将创建一个新类型的临时变量,并将其设置在iLetter中。

这个答案是什么意思? - Arnav Borborah
变量总是有名称 - “临时值”或仅使用“值”更好的术语 - M.M

0

你的强制类型转换是一种隐式转换,这意味着强制类型转换是多余的,不需要使用,只需执行以下操作:

int iLetter = Letter; //This is a safe conversion as well

如果这个正确,它会查看 "Letter" 的内存位置/值吗?
是的。显然,将查看 Letter 的值,就像所看到的变量的值一样,否则编译器会不知道你在说什么。
- 然后更改该值以表示你想要转换的任何内容吗?
原始值不会被更改,只会被复制,并将该值转换为 int,以返回字符代码。

字母“被看待”的值是如何确定的?这让人觉得代码会进行特殊检查,但我们可以在这里看到编译器认为转换是安全的,并且该值并没有以任何方式“被看待”,也没有接受特殊考虑。 - kfsone
强制转换是使用 explicit 转换。没有强制转换的代码使用 implicit 转换。 - Pete Becker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接