2015-08-28 42 views
1

我有這樣的例子簡單的代碼:C++雙重代表ASM

int main() { 
    double i_3 = 4.1; // 8 bytes 
    return 0; 
} 

讓我們編譯該樣品與-S選項:

g++ -S -o asm_types.s asm_types.cpp 

編譯器返回與下面的代碼.s文件:

.file "asm_types.cpp" 
    .text 
    .globl main 
    .type main, @function 
main: 
.LFB0: 
    .cfi_startproc 
    pushq %rbp 
    .cfi_def_cfa_offset 16 
    .cfi_offset 6, -16 
    movq %rsp, %rbp 
    .cfi_def_cfa_register 6 
    movabsq $4616302208045442662, %rax 
    movq %rax, -8(%rbp) 
    movl $0, %eax 
    popq %rbp 
    .cfi_def_cfa 7, 8 
    ret 
    .cfi_endproc 
.LFE0: 
    .size main, .-main 
    .ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4" 
    .section .note.GNU-stack,"",@progbits 

我試圖瞭解這一行.s文件

的0
movabsq $4616302208045442662, %rax 

什麼是4616302208045442662?

感謝

+4

這是一個64位整數立即設置爲你想要的'double'值相同的位。 – EOF

+1

請參閱[binaryconvert](http://www.binaryconvert.com/result_double.html?decimal=052046049) – Jester

+0

別忘了'printf'%x \ n'4616302208045442662'產生'4010666666666666' –

回答

0

你基本上要在IEEE 754讀取了,具體怎麼它存儲(編碼)的二進制值。但是,在短,它打破數量爲三個主件(在此情況下爲64比特):

  • 符號(1個比特)
  • 指數(11位)
  • 部分(52位)

你可能會問的主要問題是4.1是如何變成如此多的隨機位(4616302208045442662h)。它主要是如何的數量,發生破碎和縮放的結果。縮放是需要提供的significant digits可以非常小的數字和非常大的數字之間滑動當量數。

閱讀:

+0

非常感謝答案 ! – boddicheg