計算機是怎麼區分int類型和float類型的數據的?
int類型佔4個位元組,float類型的數據也佔4個位元組,計算機在處理數據的時候是怎麼區分這兩種數據類型的?是進行了包裝還是?
CPU 不會區分,你往 EAX 里灌個整數然後取出來 FADD 不會有任何問題。數據類型是編譯器處理的。對於靜態類型語言,編譯器會在編譯時確定每個表達式的類型;對於動態類型語言,則會在內存中額外記錄類型。
為什麼不動手實驗一下呢?看彙編。
int main() {
int a = 789;
float b1 = 123.0f;
float b2 = 234.0f;
float b3 = 345.0f;
float b4 = 456.0f;
double b5 = 1234.0;
double b6 = 2345.0;
return 0;
}
.file "float.c"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
leal 4(%esp), %ecx
.cfi_def_cfa 1, 0
andl $-8, %esp
pushl -4(%ecx)
pushl %ebp
.cfi_escape 0x10,0x5,0x2,0x75,0
movl %esp, %ebp
pushl %ecx
.cfi_escape 0xf,0x3,0x75,0x7c,0x6
subl $52, %esp
movl $789, -12(%ebp)
movl .LC0, %eax
movl %eax, -16(%ebp)
movl .LC1, %eax
movl %eax, -20(%ebp)
movl .LC2, %eax
movl %eax, -24(%ebp)
movl .LC3, %eax
movl %eax, -28(%ebp)
fldl .LC4
fstpl -40(%ebp)
fldl .LC5
fstpl -48(%ebp)
movl $0, %eax
addl $52, %esp
popl %ecx
.cfi_restore 1
.cfi_def_cfa 1, 0
popl %ebp
.cfi_restore 5
leal -4(%ecx), %esp
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size main, .-main
.section .rodata
.align 4
.LC0:
.long 1123418112
.align 4
.LC1:
.long 1131020288
.align 4
.LC2:
.long 1135378432
.align 4
.LC3:
.long 1139015680
.align 8
.LC4:
.long 0
.long 1083394048
.align 8
.LC5:
.long 0
.long 1084379648
.ident "GCC: (GNU) 4.9.1"
.section .note.GNU-stack,"",@progbits
我的理解是編譯器把你的代碼翻譯成機器指令,機器指令中已經指明了是浮點操作還是其它操作。
指令+數據=程序
數據類型其實是指令決定的
CPU是不會區分數據類型的,編譯器會用不同的指令處理各種類型的數據,解釋型語言需要記錄數據類型
推薦閱讀:
※編譯器為什麼在一次編譯過程中要儘可能的發現所有錯誤?
※你覺得編譯程序中使用的關鍵技術都有哪些應用方向?請詳細說明。
※如果想要寫一個C++或者面向對象的語言的一個簡單的編譯器,應該學習哪些領域的知識?
※Clang裡面真正的前端是什麼?
※gcc編譯器為什麼不直接編譯成機器代碼?