[英]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;
其中ref是QByteArray 。
我注意到,盡管鑄造了 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
(或其他更大的無符號類型)時,語言指定符號擴展首先發生。 為避免這種情況,第一步將char
為unsigned char
。 您不應該需要任何其他演員 - 大小的增加應該自動發生。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.