如果原始位被复制,它还叫铸造吗?

If the raw bits are copied, Is it still called casting?

当我将 float 转换为 int 时,例如:

float f = 32.4;
int i = (int)f;

f 的原始位不会直接复制到 i,而是将表示 32 的位复制到 i

如果 int 转换的工作方式不同并且只将 f 的原始位复制到 i,它仍然称为转换吗?还是转换意味着必须复制指定类型(在本例中为 int)可以表示的最少信息量?

C 转换可以执行 static_castreinterpret_castconst_cast 中的任何一个,甚至可以是两者的组合,具体取决于上下文。这就是为什么它是非常危险的表示法:当代码被维护时,它的含义可能会非常意外地改变。 C 转换甚至可以让您访问无法访问的基础,这是没有命名转换的。

A reinterpret_cast 旨在保留位,尽管这取决于实现。

它只能转换指针和引用。然而,这可能不是 1 的初衷,并且很容易通过编写例如reinterpret_cast<U&>( t_instance )。无论如何,当您执行 reinterpret_cast 时,您通常处于正式的未定义行为领域, 但是 依赖平台- and/or 编译器保证:您负责代码的可移植性(如果有),而不是将其留给标准的保证。


1) 根据我曾经私下访问过的一些代码中尝试但无效的 reinterpret_cast 来判断,即,这是一个明智的意见。

你展示的还是叫选角。如果你想复制原始位,你可以使用 memcpy:

int i;
static_assert(sizeof(i) == sizeof(f), "oops");
memcpy(&i, &f, sizeof(i));

根据Wikipedia上的解释,'casting'表示发生了类型转换。根据转换的类型和定义,这可能只是原始数据的复制以及复杂的解释机制。不需要演员以任何一种方式工作;然而,原始数据的副本通常不是所需的行为。

单词cast是语法结构的名称。这些都是演员表:

(any_typename) foo
static_cast<any_typename>(foo)
reinterpret_cast<any_typename>(foo)

转换也可以称为显式转换。没有用cast notation写的转换叫做implicit.

转换可能会也可能不会作为 "raw bits copy" 实施。转换 int i = f; (有或没有强制转换运算符 - 没有区别)不能。但是,如果 intlong 在该平台上的大小相同,则 long x = 5; int i = x; 可能是。

另一个可能是原始位副本的转换是 char *ptr = "hello"; void *q = ptr;。通常,其他指针转换可能不是原始位副本。

用户定义类型(即 class 类型)之间的转换只有在 class 定义了转换运算符或转换构造函数时才会发生,在这种情况下,您编写代码来指定如何执行转换。