gpt4 book ai didi

当 x 是 uint8 时,x |= 128 的好奇 gcc 编译器代码

转载 作者:行者123 更新时间:2023-12-01 23:15:05 25 4
gpt4 key购买 nike

我最近偶然发现了一个有趣的编译器代码,但我不明白。采取以下代码:

unsigned char x;
...
x |= 127;
x |= 128;

对于第一个语句,编译器生成:

or eax, 0x7f.

但是,对于第二个语句,它变为:

or eax, 0xffffff80

似乎对于小于 127 的值,使用一字节值,而在 128 个双字之后则首选。

有人知道为什么会发生这种情况吗?我复制了这个 gcc 6.2(我认为是最新的)。

我尝试在 gcc 邮件列表( [email protected][email protected] )上发帖,但只收到发送失败的消息。

最佳答案

从反汇编输出中可以明显看出,两条指令都是 3 个字节宽:

 83 c8 7f                or     $0x7f,%eax
83 c8 80 or $0xffffff80,%eax

83/1 是 32-bit register / memory with 8-bit sign-extended immediate value :

83 /1 ib    OR r/m32,imm8   r/m32 OR imm8 (sign-extended).

因此实际上它确实改变了32位寄存器的不可见部分,但这并不重要。它的效率并不比任何其他方法低。除了使用 8 位寄存器一半/四分之一进行操作的指令外,没有任何指令不会对 8 位立即值进行符号扩展。但使用此指令使其与其他可通过 r/m32 寻址但无法作为单个字节访问的寄存器(例如 edi、esi)以相同的方式工作。

关于当 x 是 uint8 时,x |= 128 的好奇 gcc 编译器代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43732709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com