c語言的加減乘除是怎麼實現的?

時間 2021-07-14 15:40:56

1樓:

大致了解簡單的過程,我們知道機器執行的都是機器碼,加減乘除這些在硬體層面CPU都提供對應的指令(我們能讀懂的是彙編指令),編譯器在編譯的時候直接將高階語言的加減乘除轉化為對應的CPU指令,完成對應的運算。

比如intel彙編中:

加法, addl

減法,subl

乘法, imull

除法,idivl

比如我寫了以下幾個加減乘除的函式:

// Type your code here, or load an example.

intadd

(inti,

intj

)int

sub(

inti

,intj)

intmultiply

(inti,

intj

)int

div(

inti

,intj)

使用gcc編譯輸出彙編檔案

add(

int,

int):

pushq

%rbp

movq

%rsp,%

rbpmovl

%edi,-

4(%rbp

)movl

%esi,-

8(%rbp

)movl-4

(%rbp),

%edx

movl-8

(%rbp),

%eax

addl

%edx,%

eaxpopq

%rbp

retsub

(int

,int

):pushq

%rbp

movq

%rsp,%

rbpmovl

%edi,-

4(%rbp

)movl

%esi,-

8(%rbp

)movl-4

(%rbp),

%eax

subl-8

(%rbp),

%eax

popq

%rbp

retmultiply

(int

,int

):pushq

%rbp

movq

%rsp,%

rbpmovl

%edi,-

4(%rbp

)movl

%esi,-

8(%rbp

)movl-4

(%rbp),

%eax

imull-8

(%rbp),

%eax

popq

%rbp

retdiv

(int

,int

):pushq

%rbp

movq

%rsp,%

rbpmovl

%edi,-

4(%rbp

)movl

%esi,-

8(%rbp

)movl-4

(%rbp),

%eax

cltd

idivl-8

(%rbp)

popq

%rbp

ret這幾個函式都沒做什麼編譯優化,前面的pushq movl等操作都是在準備引數,關鍵的幾個就是對應的加減乘除指令,然後返回對應的值。還有這些是簡單的整數運算,對於浮點數運算,現在CPU都帶有浮點運算單元,理論上也提供相應的指令集(如果說錯了請打臉)。

編譯器在實現的時候會根據一些運算的情況作優化,比如 i--的操作可以優化為 + (-1), 再比如除以乘以 2^n 可以優化為移位操作。

詳細怎麼實現的要看各個編譯器的原始碼,對於這方面的知識不熟悉,可以請教一些編譯器方面的人。

加減乘除的物理意義是什麼?

翌文 知之為知之不知為不知,我真不知道是什麼。但我想應該體現的是各個物理量之間是可以互相轉換的吧!就像質能方程體現了質量能轉換成能量,還有相對論的時間是空間的一維。能完全搞懂這些內在聯絡,估計離大一統理論不遠了。仔細體會吧! HHHHH 物理在數學上的描述是很明確的,你看單位就知道了。同量綱的物理數...

加減乘除的意義講了上百遍,例題做過上百遍,孩子仍然乙個應用題也獨立做不出來,是智商有問題嗎?

蕭蕭的札記 學習知識的過程需要自己思考,吃透嚼碎嚥下去,再吸收成自己的知識。給孩子講題,不能告訴他,要像猜謎語一樣,讓他自己想。直接說的話,是沒有意義的。引導啟發的提問,慢慢引出結果。抽象的數字理解不了,就用實物。多點耐心。 yxxxxxxxxx 首先要注意對孩子交流時的語言 動作 語氣,盡最大可能...

C語言中強制型別轉換是如何實現的?

涇渭漳淮 強制轉換時怎麼實現的?通常是由單獨的CPU指令實現的,也就是硬體實現的。5立方之後是125,125開立方之後是幾?嚴格的數學上應該是5,但實際上計算機有精度的限制,計算結果會有誤差,計算機計算得到的結果可能是4.9999999999999435452340065849之類的,將這個值直接取...