我正在尝试翻译C程序。目标语言并不重要,我只是想了解程序的每个部分正在做什么。
我找不到任何关于的细节:
variable=1;
while(variable);
我知道这是一个循环,这是真的(我已经在堆栈溢出中读到类似的问题,其中代码实际执行)但在这种情况下,没有与此相关的代码。所以我想知道,节目是否正在睡觉#34; - 这时正在执行吗?
然后,另一部分我不明白的是:
variable=0;
variable=variable^0x800000;
我相信这个值应该是24位,但这是否真的需要在任何其他编程语言中不是低级别的C?
非常感谢
答案 0 :(得分:2)
while(variable);
实现自旋锁;即这个帖子将保留在此语句中,直到variable
为0.我已经介绍了这个术语,以帮助您用新语言搜索一个好的技术。
它显然会烧毁CPU,但如果只使用几个时钟周期,这可能是一种非常有效的方法。要使其正常运行,variable
需要使用volatile
进行限定。
variable = variable ^ 0x800000;
是一个XOR操作,在这种情况下实际上是一个单位切换。 (我希望在多线程代码中看到variable ^= 0x800000
。)它的确切用法可以从它的上下文中解释。请注意,如果XOR的参数小于int
,则它们的参数将被提升为variable^0x800000
。值得怀疑的是int
是24位类型的,除非 {{1}}是您平台上的那个大小(不太可能,但可能)。
答案 1 :(得分:2)
我正在尝试翻译C程序。
不要翻译 C 程序,除非您正在编写compiler(有时称为转换程序 - 或source to source compiler - ,如果转换为不同的汇编程序的其他编程语言,这将执行此类任务。而且你需要做很多工作(对于一个天真的编译器来说至少需要几个月的时间TinyCC,而且可能需要几十年的时间)
在 C 中思考并尝试理解其semantics(比语法更重要)。
while(variable);
该循环有一个空体。使空体明显(语义保持不变)更具可读性:
while(variable) {};
由于循环的主体(和测试)不会更改variable
(它没有 observable side-effect),循环将无限期地运行variable
的初始值不为零。这会加热你的处理器。
但是您可能已将variable
声明为volatile,然后在外部更改它。
variable=variable^0x800000;
^
是bitwise XOR。您正在切换(将0替换为1,将0替换为0)一位(23 rd 一,IIRC)
答案 2 :(得分:1)
回答你的第二个问题: 变量= 0; 变量=可变的0x800000 ^;
此操作是一个称为XOR的按位操作。
XOR操作通常用于切换位,而不管它以前的状态如何:
0 ^ 1 = 1
1 ^ 1 = 0