gpt4 book ai didi

c++ - 错误的符号扩展 c++/qt

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:21 26 4
gpt4 key购买 nike

我在桌面 x64 Intel 架构(gcc 编译器、linux)和 RaspberryPi Arm(gcc 交叉编译器)上运行以下代码。

quint32 id;

id=((quint32)ref[1]);
id|=((quint32)ref[2])<<8;
id|=((quint32)ref[3])<<16;
id|=((quint32)ref[4])<<24;

其中 ref 是一个 QByteArray

我注意到,尽管转换了 quint32(它是无符号整数),但当给定字节为负数时,我的 Pc 会执行导致错误的符号扩展。我的代码在 Arm 上运行良好。为什么会这样? 我认为类型转换应该防止这种情况。不是吗?

   id|=((quint32)ref[4])<<24;

反汇编:

    mov    -0x160(%rbp),%rax
mov $0x4,%esi
mov %rax,%rdi
callq 0x425af0 <QByteArray::operator[](int)>
mov %rax,%rcx
mov %edx,%eax
mov %rcx,-0x170(%rbp)
mov %eax,-0x168(%rbp)
mov -0x170(%rbp),%rax
mov %rax,-0x40(%rbp)
mov -0x168(%rbp),%rax
mov %rax,-0x38(%rbp)
lea -0x40(%rbp),%rax
mov %rax,%rdi
callq 0x425aa0 <QByteRef::operator char() const>

movsbl %al,%eax #sign extension.

shl $0x18,%eax
or %eax,-0x148(%rbp)

我还注意到,编译器使用 QByteRef 返回值而不是 char。但我猜它应该不会导致任何错误。

来自 QByteArray帮助页面:

QByteRef    operator[](int i)
char operator[](int i) const
QByteRef operator[](uint i)
char operator[](uint i) const

提前致谢

最佳答案

当从有符号的 char 转换为 unsigned int(或其他更大的无符号类型)时,语言指定先进行符号扩展。为避免这种情况,第一步是将 char 转换为 unsigned char。您不需要任何其他转换 - 大小的增加应该会自动发生。

关于c++ - 错误的符号扩展 c++/qt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22585465/

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