gpt4 book ai didi

c - 将 unsigned int(通过负数)分配给有符号 long long 时出现意外值

转载 作者:行者123 更新时间:2023-12-02 02:07:43 25 4
gpt4 key购买 nike

我碰巧遇到了一个奇怪的问题,请参阅下面的代码:

#include <stdio.h>

int main() {
unsigned char a = 10;
unsigned int b = 10;

long long x = -a;
long long y = -b;

printf("x = %lld, y = %lld\n", x, y);
return 0;
}

输出:

x = -10, y = 4294967286

正如你所看到的,当我分配 -b 时至y (long long),它给出了错误的结果,但 x 的值符合预期。

阅读asm代码后,我发现当将负的unsigned char赋给long long时,编译器会生成cdqe指令(参见第 +25 行)将符号扩展为 rax,而当 unsigned int 扩展为 long long 时,它不会执行相同的操作。

我知道我们得到值 4294967286 的原因是rax的高32位全为零,rax = 0x00000000fffffff6 .

所以我的问题是为什么编译器缺少 cdqe unsigned int 情况下的指令?

Dump of assembler code for function main:
0x000000000040052d <+0>: push rbp
0x000000000040052e <+1>: mov rbp,rsp
0x0000000000400531 <+4>: sub rsp,0x20
=> 0x0000000000400535 <+8>: mov BYTE PTR [rbp-0x1],0xa
0x0000000000400539 <+12>: mov DWORD PTR [rbp-0x8],0xa
0x0000000000400540 <+19>: movzx eax,BYTE PTR [rbp-0x1]
0x0000000000400544 <+23>: neg eax
0x0000000000400546 <+25>: cdqe
0x0000000000400548 <+27>: mov QWORD PTR [rbp-0x10],rax
0x000000000040054c <+31>: mov eax,DWORD PTR [rbp-0x8]
0x000000000040054f <+34>: neg eax
0x0000000000400551 <+36>: mov eax,eax
0x0000000000400553 <+38>: mov QWORD PTR [rbp-0x18],rax
0x0000000000400557 <+42>: mov rdx,QWORD PTR [rbp-0x18]
0x000000000040055b <+46>: mov rax,QWORD PTR [rbp-0x10]
0x000000000040055f <+50>: mov rsi,rax
0x0000000000400562 <+53>: mov edi,0x400610
0x0000000000400567 <+58>: mov eax,0x0
0x000000000040056c <+63>: call 0x400410 <printf@plt>
0x0000000000400571 <+68>: mov eax,0x0
0x0000000000400576 <+73>: leave
0x0000000000400577 <+74>: ret

环境:

OS: CentOS Linux release 7.8.2003 (Core), Linux 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 GNU/Linux
Gcc: gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39)

最佳答案

这与隐式整数转换有关。

  • unsigned char a:首先转换为 int,然后取反。结果,-10

  • unsigned int b:转换,因此-b取反>unsigned int,您将得到UINT_MAX - 10 + 1

如果您首先转换为目标类型 -(long long)b,您也会得到 -10

进一步阅读:Implicit conversions

关于c - 将 unsigned int(通过负数)分配给有符号 long long 时出现意外值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68176737/

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