1次null/void/undefined的汇编版本是什么?
What is the assembly version of 1 times null/void/undefined?
首先,我知道无效和未定义代码对代码有什么作用,但计算机只知道二进制。我不能告诉它做一些我想象的事情,但没有以一种或另一种方式定义。因此,让我们假设编译器不会对我试图让它做的事情感到震惊——这些例子在汇编程序中会是什么样子,或者以另一种方式显示关键字背后的东西:
private int number;
public void method() {}
public int main() {
int i = 1 * null;
int j = 1 * number;
int k = 1 * method();
}
C 没有 void
值的概念;那是一个错误。 void*
只是“未指定,使用前强制转换”的仅编译时占位符。即通用指针值。在 C 或 asm 中取消引用它是没有意义的,这就是编译器拒绝它的原因。
int
是固定宽度并使用所有位来表示数字的值,就像在汇编中使用寄存器的简单/正常方式一样。它不能包含任何其他内容来指示“null”或“undefined”。如果你想要像 perl 这样的东西,你可以 undef $foo
,你会想要像 C++ std::optional
这样的东西,比如 <int, bool>
对值。大多数语言中的 int
必须是数字,而不是一些“哎呀我实际上不是 int”指示符。
(虽然罕见的 ISA 确实有陷阱值,例如,一个人的补码机器不允许有符号整数的全一位模式,而不是让它作为负值工作 0
。但是 在大多数 ISA 上,只有浮点值可以是 NaN - 一种特殊的位模式,表示“不是数字”。)
C 也没有 null
关键字。它有 NULL
作为预处理器宏(可以 #define
d 为 ( (void*)0 )
甚至只是 0
)。 (有趣的事实:ISO C 实际上允许实现使用他们想要的任何位模式作为空指针的运行时值,并在指针上下文中将整数 0
编译时转换为该位模式。)但是现代 CPU 上的所有正常实现都只使用 0。比如 mov x0, #0
(AArch64)。所以至少你问题的一部分确实有答案。
所以基本上你不能在 C 中做任何这些事情,因为它们实际上没有任何意义,你也不能在 asm 中做它们。 C 编译器拒绝您访问的魔法层并不存在。
写出真正可以编译的C看asm输出(https://godbolt.org/ and )
首先,我知道无效和未定义代码对代码有什么作用,但计算机只知道二进制。我不能告诉它做一些我想象的事情,但没有以一种或另一种方式定义。因此,让我们假设编译器不会对我试图让它做的事情感到震惊——这些例子在汇编程序中会是什么样子,或者以另一种方式显示关键字背后的东西:
private int number;
public void method() {}
public int main() {
int i = 1 * null;
int j = 1 * number;
int k = 1 * method();
}
C 没有 void
值的概念;那是一个错误。 void*
只是“未指定,使用前强制转换”的仅编译时占位符。即通用指针值。在 C 或 asm 中取消引用它是没有意义的,这就是编译器拒绝它的原因。
int
是固定宽度并使用所有位来表示数字的值,就像在汇编中使用寄存器的简单/正常方式一样。它不能包含任何其他内容来指示“null”或“undefined”。如果你想要像 perl 这样的东西,你可以 undef $foo
,你会想要像 C++ std::optional
这样的东西,比如 <int, bool>
对值。大多数语言中的 int
必须是数字,而不是一些“哎呀我实际上不是 int”指示符。
(虽然罕见的 ISA 确实有陷阱值,例如,一个人的补码机器不允许有符号整数的全一位模式,而不是让它作为负值工作 0
。但是 在大多数 ISA 上,只有浮点值可以是 NaN - 一种特殊的位模式,表示“不是数字”。)
C 也没有 null
关键字。它有 NULL
作为预处理器宏(可以 #define
d 为 ( (void*)0 )
甚至只是 0
)。 (有趣的事实:ISO C 实际上允许实现使用他们想要的任何位模式作为空指针的运行时值,并在指针上下文中将整数 0
编译时转换为该位模式。)但是现代 CPU 上的所有正常实现都只使用 0。比如 mov x0, #0
(AArch64)。所以至少你问题的一部分确实有答案。
所以基本上你不能在 C 中做任何这些事情,因为它们实际上没有任何意义,你也不能在 asm 中做它们。 C 编译器拒绝您访问的魔法层并不存在。
写出真正可以编译的C看asm输出(https://godbolt.org/ and