如果原始位被复制,它还叫铸造吗?
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_cast
、reinterpret_cast
或 const_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;
(有或没有强制转换运算符 - 没有区别)不能。但是,如果 int
和 long
在该平台上的大小相同,则 long x = 5; int i = x;
可能是。
另一个可能是原始位副本的转换是 char *ptr = "hello"; void *q = ptr;
。通常,其他指针转换可能不是原始位副本。
用户定义类型(即 class 类型)之间的转换只有在 class 定义了转换运算符或转换构造函数时才会发生,在这种情况下,您编写代码来指定如何执行转换。
当我将 float
转换为 int
时,例如:
float f = 32.4;
int i = (int)f;
f
的原始位不会直接复制到 i
,而是将表示 32
的位复制到 i
。
如果 int
转换的工作方式不同并且只将 f
的原始位复制到 i
,它仍然称为转换吗?还是转换意味着必须复制指定类型(在本例中为 int
)可以表示的最少信息量?
C 转换可以执行 static_cast
、reinterpret_cast
或 const_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;
(有或没有强制转换运算符 - 没有区别)不能。但是,如果 int
和 long
在该平台上的大小相同,则 long x = 5; int i = x;
可能是。
另一个可能是原始位副本的转换是 char *ptr = "hello"; void *q = ptr;
。通常,其他指针转换可能不是原始位副本。
用户定义类型(即 class 类型)之间的转换只有在 class 定义了转换运算符或转换构造函数时才会发生,在这种情况下,您编写代码来指定如何执行转换。