如果scanf的格式指示符是 f,賦給乙個double型的變數,在記憶體層面上會發生什麼?

時間 2021-06-08 06:00:22

1樓:

這個問題比較有趣。

我們先貼一段 scanf 對於浮點處理的原始碼(來自scanf.c,minix核心原始碼(引用自cnblogs))

#ifndef NOFLOAT

long

double

ld_val

;#endif

預設將所有浮點型用 Lf 來儲存,可以保證所有精度。

#ifndef NOFLOAT

case

'e':

case

'E':

case

'f':

case

'g':

case

'G':if(

!(flags

&FL_WIDTHSPEC)||

width

>NUMLEN

)width

=NUMLEN;if

(!width

)return

done

;str

=f_collect(ic

,stream

,width

);if

(str

str==

inp_buf&&(

*str

=='-'||*

str==

'+')))

return

done;/*

Although the length of the number is str-inp_buf+1

we don't add the 1 since we counted it already

nrchars

+=str

-inp_buf;if

(!(flags

&FL_NOASSIGN

))break

;#endif

我們可以發現,賦值是由最後乙個 if 實現的。

例如 *va_arg(ap, float *) = (float) ld_val; 是對浮點型的賦值。

因為位址在同PC上大小固定,所以實際上賦值左元 *va_arg(ap, float *) 、 *va_arg(ap, double *) 、和 *va_arg(ap, long double *) 沒有任何區別,僅有的區別就是賦值右元的強制轉換過程。

因為有 FLT_MAX 3.402823466e+38F 和 DBL_MAX 1.7976931348623158e+308 ,所以我們可以知道 float 的精度要遠低於 double,而強轉可能會損失精度。

而 float 的記憶體是這樣的:

因此我們可以知道:

如果scanf的格式指示符是%f,賦給乙個double型的變數:

當輸入值在 float 表示範圍內且為非負時,不會有任何差別。

當輸入值在 float 表示範圍外且為非負時,會損失變數的 0xFFFFFFFF00000000 中的所有非零位的內容;

當輸入值為負值時。。。自求多福吧,float的符號位在 double 裡面是尾數字的區段,會讓資料變得很詭譎,而且,0xFFFFFFFF00000000 的所有內容也全部丟失,也就是保持原樣。

如果給CS GO新增乙個閉眼0 5秒的操作是否會影響遊戲平衡還是增加了遊戲性

Shark 我認為這是乙個不合理的想法 因為你玩遊戲的時候也得眨眼,而遊戲如果自帶眨眼效果那就是兩個人的視野,並不是你乙個人的視野。如果遊戲眨眼一次0.5s,你眨眼0.3s,如果又碰巧兩次眨眼無縫銜接,那麼就有將近1s的盲視時間,極大降低遊戲體驗。所以這種假設會影響遊戲體驗。來自人本身的需要眨眼。 ...

如果乙個男人老給乙個女人發紅包,(前提是男人女人都有自己的家庭),這正常嗎?

安安安啦 很不正常,男的應該想婚外戀,搞曖昧,狩獵你,吃著碗裡看著鍋裡,想你做他的 彩旗 畢竟,面對有夫之婦的這個女人,他不用負責 老實人寧死不接盤 我想你既然問這個問題,多半不是故事裡的人。正常不正常其實不好講,弄明白原因很重要,原因決定了是否正常。如果你是轉錢方家屬,要考慮你家男人和那個女人的關...

統計學的T檢驗 F檢驗 和T分布 F分布是乙個概念嗎,怎麼理解呢?

用來觀學術 師者,傳道受業解惑也,而知乎的存在可以將老師集合在一塊,伸手族是啥,是學生嗎,看的書從書中獲取知識也是伸手族,伸手族就算有定義,也不是這樣的定義,講廢話的存在 簡單來說,T檢驗或F檢驗,就是做一次實驗,這次試驗的結果應該落在T分布或F分布的主要區間內。如果落在邊緣,那麼這種可能性應該很小...