Assembly 1次null/void/undefined的程序集版本是什么?

Assembly 1次null/void/undefined的程序集版本是什么?,assembly,null,undefined,keyword,void,Assembly,Null,Undefined,Keyword,Void,首先,我知道null-void和不定义代码的作用,但是计算机只知道二进制代码。我不能告诉它去做我想象中的事情,也不能用这种或那种方式去定义它。因此,让我们假设编译器不会因为我试图让它做的事情而心脏病发作——这些示例在assembler中会是什么样子,或者以另一种方式显示关键字后面的内容: private int number; public void method() {} public int main() { int i = 1 * null; int j = 1 * n

首先,我知道null-void和不定义代码的作用,但是计算机只知道二进制代码。我不能告诉它去做我想象中的事情,也不能用这种或那种方式去定义它。因此,让我们假设编译器不会因为我试图让它做的事情而心脏病发作——这些示例在assembler中会是什么样子,或者以另一种方式显示关键字后面的内容:

private int number;

public void method() {}

public int main() {
    int i = 1 * null;
    int j = 1 * number;
    int k = 1 * method();
}

C没有
void
值的概念;那是个错误
void*
只是“未指定,使用前强制转换”的编译时占位符。i、 e.通用指针值。在C或asm中取消对它的引用是毫无意义的,这就是编译器拒绝它的原因

一个
int
是固定宽度的,它使用所有的位来表示一个数字的值,就像在汇编中使用寄存器的简单/正常方法一样。它不能保存任何其他内容来表示“null”或“undefined”。如果您想要类似perl的东西,其中可以
undef$foo
,那么您需要类似于
的值对。大多数语言中的
int
必须是一个数字,而不是一些“哎呀,我实际上不是int”指示符

(虽然少数ISA确实有陷阱值,例如,一个补码机器不允许有符号整数使用全一位模式,而不是将其作为负
0
。但是在大多数ISA上,只有浮点值可以是NaN-一种特殊的位模式,表示“不是数字”


C也没有
null
关键字。它有
NULL
作为预处理器宏(可以是
#将
d定义为
((void*)0)
甚至只是
0
)。(有趣的事实:ISO C实际上允许实现使用他们想要的任何位模式作为空指针的运行时值,并在指针上下文中将整数
0
编译时转换为该位模式。)但现代CPU上的所有普通实现都只使用0。像
movx0,#0
(AArch64)。所以你们的问题至少有一部分有答案


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


编写能够实际编译并查看asm输出的C(并且)

C没有
void
值的概念;那是个错误
void*
只是“未指定,使用前强制转换”的编译时占位符。i、 e.通用指针值。在C或asm中取消对它的引用是毫无意义的,这就是编译器拒绝它的原因

一个
int
是固定宽度的,它使用所有的位来表示一个数字的值,就像在汇编中使用寄存器的简单/正常方法一样。它不能保存任何其他内容来表示“null”或“undefined”。如果您想要类似perl的东西,其中可以
undef$foo
,那么您需要类似于
的值对。大多数语言中的
int
必须是一个数字,而不是一些“哎呀,我实际上不是int”指示符

(虽然少数ISA确实有陷阱值,例如,一个补码机器不允许有符号整数使用全一位模式,而不是将其作为负
0
。但是在大多数ISA上,只有浮点值可以是NaN-一种特殊的位模式,表示“不是数字”


C也没有
null
关键字。它有
NULL
作为预处理器宏(可以是
#将
d定义为
((void*)0)
甚至只是
0
)。(有趣的事实:ISO C实际上允许实现使用他们想要的任何位模式作为空指针的运行时值,并在指针上下文中将整数
0
编译时转换为该位模式。)但现代CPU上的所有普通实现都只使用0。像
movx0,#0
(AArch64)。所以你们的问题至少有一部分有答案


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


编写能够实际编译并查看asm输出的C(和)

这是什么语言?您希望这段代码具有什么语义,并且希望在asm中实现?如果您希望程序集中的值可以是“未定义的”,如perl
unset$foo
,那么您需要自己实现它。类似C++ <代码> STD::可选< /COD>(),类似于<代码> <代码>对值。大多数语言中的
int
必须是一个数字,而不是一些“oops I'm not really a int”指示符,尽管少数isa确实有陷阱值。IDK你想要做什么
1*method()
;它不返回任何东西,也不需要乘法或赋值给
int
。或者用其他公式来表示,对于未定义的变量
null
,这三个变量是如何用C实现并用二进制表示的(bcs,如果它在std中,它必须以某种方式保存,至少必须是void和null),这就像在问“什么是‘qhwwwiud’的法语翻译?”你不能“实现”一开始就没有任何意义的东西“除非你还对它将要做什么做一些假设,否则没有帮助,这使问题远离现实。这是什么语言?您希望这段代码具有什么语义,并且希望在asm中实现?如果您希望程序集中的值可以是“未定义的”,如perl
unset$foo
,那么您需要自己实现它。类似C++ <代码> STD::可选< /COD>(),类似于<代码> <代码>对值。大多数语言中的
int
必须是数字,而不是一些“oops I”