簡體   English   中英

從 double 轉換總是返回零

[英]Casting from double always returns zero

為什么以下代碼在使用 clang 編譯時返回零?

#include <stdint.h>
uint64_t square() {
    return ((uint32_t)((double)4294967296.0)) - 10;
}

它生產的組件是:

    push    rbp
    mov     rbp, rsp
    xor     eax, eax
    pop     rbp
    ret

我原以為 double 會變成零(整數),而那個減號會將它包裹起來。 換句話說,為什么要減去的數字無關緊要,因為它總是產生零? 請注意,gcc 確實產生了不同的數字,正如預期的那樣:

    push    rbp
    mov     rbp, rsp
    mov     eax, 4294967285
    pop     rbp
    ret

我假設將 4294967296.0 轉換為uint32_t是未定義的行為,但即便如此,我仍希望為不同的減數產生不同的結果。

將超出范圍的double轉換為unsigned類型的行為確實是undefined

環繞適用,即使對於unsigned類型也是如此。

這是一個經常被遺忘的規則。

一旦程序控制到達一個未定義的結構,整個程序就是未定義的,甚至有些矛盾的是,已經運行過的語句。

參考: https : //timsong-cpp.github.io/cppwp/conv.fpint#1

g++ 5.4.0 給出了 4294967285(-11 無符號),因此編譯器決定如何處理未定義的行為。

__Z6squarev:
LFB1023:
        .cfi_startproc
        pushl   %ebp
        .cfi_def_cfa_offset 8
        .cfi_offset 5, -8
        movl    %esp, %ebp
        .cfi_def_cfa_register 5
        movl    $-11, %eax
        movl    $0, %edx
        popl    %ebp
        .cfi_restore 5
        .cfi_def_cfa 4, 4
        ret
        .cfi_endproc

暫無
暫無

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

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