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

Wrong sign extension c++/qt

本文关键字:qt c++ 扩展 符号 错误      更新时间:2023-10-16

我在桌面x64英特尔架构(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(这是unsigned int),我的电脑做的符号扩展导致错误,当给定的字节是一个负数。我的代码在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

Thanks in advance

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