簡體   English   中英

錯誤的符號擴展 c++/qt

[英]Wrong sign extension c++/qt

我在桌面 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;

其中refQByteArray

我注意到,盡管鑄造了 quint32(它是 unsigned int),但當給定的字節是負數時,我的 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 (或其他更大的無符號類型)時,語言指定符號擴展首先發生。 為避免這種情況,第一步將charunsigned char 您不應該需要任何其他演員 - 大小的增加應該自動發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM