將double型別用 d輸出時,是讀取的哪32位?

時間 2021-06-05 15:12:53

1樓:悽臨雨

我猜猜吧,棧資料都要倒序入棧,左邊的引數後入棧,後入棧的在棧記憶體裡在位址小的那邊,所以用記憶體檢視器看的話,變數的記憶體順序小到大和引數順序左到右一致。

x86下小於4位元組的變數入棧占用4個位元組。

讀取的時候,第乙個%?會對應引數最左邊的,也就是棧最深的那個值

根據%d %f %lld啥指明的變數大小(向上取4的倍數)來從棧最深處依次讀取

x86或x64 double尾數的那一段存在左邊,指數的那一端存在右邊

int64 小的那一段存在左邊,大的/符號位那一端存在右邊

總之printf("%x %x %x %x %x %x %x %x", (char)5, (short)6, (double)1.0f, (uint64_t)0x123'0000'0456ULL);

5 6 0 3ff00000 456 123 0 0 (這兩個0是不穩定的)

2樓:wyxsdzz

譚浩強式問題。比分析 a+=a-=a*a 更無知更無聊

程式設計是為了解決問題,不是為了製造問題,更不是為了製造無聊無用的問題。

3樓:Hocker

為啥要用%d輸出,明明知道有問題,還要這麼做,不按規定做,就不要學程式設計,容易寫bug。

說一下吧,我們現在一般接觸到的處理器都是小端對齊,如果偏要用32位的結構去訪問64位的結構,你會發現其實訪問的是64位結構的低32位。大端對齊的處理器就回得到64位的高32位。

然而你剛才問這個問題是常見的64位結構double和32位結構int,存在編譯器的不確定性,有的編譯器會將在編譯的時候自動轉換為數字型,然後取整,有的不做處理,直接取低32位。

未定義double卻出現他的強制型別轉換提示

大衛德劉 除號左邊float 右邊3.0被認為是doublefloat double得到的結果是double然後你把這個double賦值給了乙個float變數,所以會提示你已經有人提到了 3.0f就可以,因為3.0f是乙個float,float float得到float,就沒有轉換了 開開心心學做人...

C 中超出精度double型別的值為什麼會出現這種現象?

邱昊宇 真心沒那麼複雜。問 比 3 小的最大 double 究竟是多少?答 是 std nextafter 3.0,2.0 比如 double maxBelowThree std nextafter 3.0 2.0 auto uniqueDigits std numeric limits max d...

C語言如何將int資料放到double小數部分?

醉臥沙場 不明白為什麼這種也要出來 拜神 給你兩種方法,拿去交作業吧 有心就自己弄明白了再交,要是弄不明白就趁早轉乙個合適的專業 程式 mytest.c include include intmain int argc char argv 編譯,測試執行 gcc o mytest mytest.c ...