2

デスクトップ 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)

また、コンパイラが char の代わりに QByteRef の戻り値を使用していることにも気付きました。しかし、それは私が推測するエラーを引き起こすべきではありません。

QByteArrayヘルプページから:

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

前もって感謝します

4

1 に答える 1