C 語言 printf f n ,3 2 為什麼結果是 0 ?

時間 2021-05-09 16:36:45

1樓:李文強

你是兩個整型數運算,結果還是整型,而你輸出的型別卻是浮點型,明顯是型別不符,如果你要這樣算的話你可以3.0/2或者3/2.0,只要引數裡有乙個浮點型,那麼結果就一定是浮點型。

2樓:拆借

因為3和2而都是整形數,所以你對它的算術運算結果也是按照整形數輸出。(你要不在前面加個強制型別轉換,要不在3後面加個.0比如3.0/2)

3樓:熊傑

因為 3/2 的值等於 1,因為 3/2 認為是兩個整形運算,最後的結果是整形。 所以小數點後面的東西沒啦。

如果想要計算得浮點型, 可以寫成 3.0/2。

4樓:康殼

看了一圈回答才敢出來說話,這個語句是完全合法的c語句,而且這個結果完全可以復現和解釋。

一開始我以為題主的這個會輸出1,因為覺得printf這個函式會自己進行型別轉換,後來發現輸出的是0。於是我就懷疑是printf並不會改變這個數字,而是直接把這個位址存的東西當做浮點數去讀而已。我們都知道3/3是int 1,這個數存起來很簡單前面全是0最後是1,那麼這數如果當做浮點數來看是多少呢,答案也很簡單,就是最接近0的那個正浮數因為它的符號位是正,指數字是最小,尾數字也是最小。

那麼接下來出來這個結果就很容易了,因為%f是以小數方式顯示浮數,它預設的位數比較小,所以看到的全是0(如果你用指數方法輸出而不是小數輸出的話就能看到這個數的真面目了),這個數實際上經過了幾十個0之後後面是有東西的。如果你不會算也不要緊,把int型的指標拿到強制轉化成float指標就行了。

為了方便理解,大家可以測試一下下面這些語句的結果就懂了。

int a=3/2;%顯然這是個int 1

float* b=(float*)&a;

printf(」%f\n」,a);

printf(」%e\n」,a);

printf(」%f\n」,*b);

printf(」%e」,*b);

這裡面還有乙個小發現,如果我給到的是乙個float型,讓%f顯示它會顯示float,如果給到的是個其他的型別,它預設按照double來讀取記憶體中的二進位制數,也就是說它要讀64位,這裡的int只有32位,也就是說越界了,後面4位元組如果啥也沒存全是0那就正常,如果有東西的話就看存的什麼了。

寫到這裡是為了說明編譯器完全有能力解釋這個行為,而且這個行為是有意義的,它可以用來把int數從記憶體角度「翻譯」成double數。

總結一下就是說printf會進行隱式的指標型別轉換,對於題主的這種情況將int指標轉換成了double指標。

5樓:

C 語言 printf("%f\n",3/2) 為什麼結果是 0 ?

看到某些人說這是奧利給,沒有開啟和研究的必要,我個人不這麼認為。原因很簡單,你去陽間面試題庫里瞅一瞅,奧利給相關的題有多少?很多公司招很多陰間清潔工,還在拿著某乙個的WC出給,這些給要想完全稀釋,就要從稀釋原理入手,還要盡可能的淺顯好聞,避免變成神仙衝馬桶。

那麼身為老師,本身就是要幫助學生更好的拿到offer,那麼這些問題我不得不講,這是後面出來的。說真的,我的確不贊成研究奧利給類問題(要不然我也就不會把宣告寫在前文首了),但是現實如此,你逃不掉的。而且研究這些奧利給會讓你對一些氣味的了解更加深刻,也不是什麼壞事。

6樓:這個剎車不太靈

3和2是整形資料,相除3/2系統會預設結果是整形資料1將語句改為printf("%d\n",3/2)列印1改為float a=3/2;printf("%f\n",a);則會列印1.000000

而改為printf("%f\n",3.0/2.0);結果就是你想要的1.500000啦

7樓:pansz

簡單的說:3/2是整數,而printf後面的可變引數,沒有型別指定,不會做隱式型別轉換。

在大多數其他場合,浮點數跟整數是被編譯器自動進行型別轉換的,不用擔心這種問題。例如,函式宣告需要乙個浮點數,給乙個整數,編譯器會進行隱式型別轉換,使得實際行為符合預期。

然而,printf後面的可變引數沒有(編譯期)型別宣告,也就不會去做型別轉換,你給的是整數,那麼就會當做整數。整數的儲存格式與浮點不同,因此這裡,把整數當作浮點輸出,實際結果未定義。

至於為什麼3/2是整數,你得查查C語言語法,就理解了。

所以:為什麼結果是0?因為此處為未定義行為,結果可能為任意值。

8樓:不吃早飯

3和2都是整數,3/2計算得到的是整數的1,在記憶體裡是高31位為0,第32位為1的乙個int型別的整數,你要求printf以float型別進行輸出,但是浮點數在記憶體裡的儲存方式和int型別是不一致的。這裡你應當把3或者2強制型別轉換成float型別,這樣最終輸出的就是1.5了

9樓:jdkjskkVsjkabzgh

高讚回答對未定義行為一頓解釋就是在搞笑

他的解釋只能說明特定平台特定編譯器特定runtime特定執行狀態下可能是這個行為

並不代表其他情況會是什麼行為

長篇大論其實連最基礎的如何理解程式行為都不懂可依賴的程式行為一般不用程式語言描述

而是用自然語言在文件中描述

也就是文件都還沒學會看

10樓:勝勳

你應該寫成 3.0f/2.0f 才能得到準確的結果

因為 3 和 2 都是 int 常量,所以 3/2 的結果是 int 1

%f 是把資料以 double 格式列印出來的,int 和 double 的格式不一樣

這句相當於 printf("lf\n", 0x00000000 00000001);

double 是 52位有效數,11位指數

所以結果應該是 2的(-51)次方 x 2的(-1023)次方級別的小數

2的 -1074次方,差不多是 10的 -322次方吧

實驗結果,確實是 300多個0,每一行是80個字元,第四行結尾處才出現有效數字

把數值「1」改成其他數值,比如「0」或者「1024」,結果會有相應的變動

說明printf函式確實是讀取了後面的數值,並顯示的

11樓:bjyulq

真想學習c語言,首先要端正態度。不要懷疑編譯器,不要懷疑庫函式。就你這個問題,首先問問自己這麼寫的目的是什麼?期望有什麼收穫?

為學習C 打好C語言基礎,什麼算是C語言基礎?

懂得函式,懂得指標變數,懂得記憶體模型,懂得基本資料型別,懂得變數的生命週期,懂結構體,懂記憶體對齊。c基礎就那麼些,但是指標是真的爽。 leopard 先說結論,沒必要單獨去為了所謂的 基礎 去學習c語言。c 是c的超集,就像小學數學是高中數學的底子一樣。這句話本來沒錯,但是c 經過這麼多年的 發...

C 語言中陣列 arr 和 arr 對應的位址為什麼一樣?

題主初學吧,真要搞懂的話,詳細看看c的發展史跟各個時期的標準制定。對於型別的隱式轉換其實一直是c的最大的優點靈活,也是乙個缺點,容易出問題。很多程式的溢位問題都是出在這個上面。所以就初學者而言,理解到最高票答案的那個程度就可以了。把問題記下來,等你以後接觸的書籍越來越多,越靠近底層,你會對c有更深的...

c語言中整型變數的取值範圍是怎麼取的?為什麼是負的二的七次方到二的七次方減一?

調皮的李先生 我認為是這樣的 1byte等於8bit,也就是8個0或1,如 或11111111。其中第乙個數代表的意思是該數為正還是負,為1時代表負,為0時代表正。例如 00000001表示該數為1.至於為什麼是 2 7 2 7 1,說明一下2 7等於128,所以2 7 1等於127 因為11111...