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 作为预处理器宏(可以 #defined 为 ( (void*)0 ) 甚至只是 0)。 (有趣的事实:ISO C 实际上允许实现使用他们想要的任何位模式作为空指针的运行时值,并在指针上下文中将整数 0 编译时转换为该位模式。)但是现代 CPU 上的所有正常实现都只使用 0。比如 mov x0, #0 (AArch64)。所以至少你问题的一部分确实有答案。


所以基本上你不能在 C 中做任何这些事情,因为它们实际上没有任何意义,你也不能在 asm 中做它们。 C 编译器拒绝您访问的魔法层并不存在。

写出真正可以编译的C看asm输出(https://godbolt.org/ and )