[英]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
類型也是如此。
這是一個經常被遺忘的規則。
一旦程序控制到達一個未定義的結構,整個程序就是未定義的,甚至有些矛盾的是,已經運行過的語句。
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.