
前言:今天木木正在午睡ing,突然收到了朋友的求助訊息:

我們知道,format hex的作用是將結果用十六進制表示,但是十進制數16D的十六進制表示明明是10H,為啥是圖出那一串奇怪的數字呢?
在百度搜索了很久,得到的結果大多也只是告訴我們format的用法,根本解答不了我們的疑惑,幸好我在官方的help找到了思路,
文章目錄
- 一、hex詳解
- 1、思路
- 2、二進制雙精度數字
- 3、IEEE二進制浮點數算術標準
- 二、16->4030000000000000
- 三、 π \pi π ->400921fb54442d18
一、hex詳解
1、思路
既然網上全部都是說format的用法,不防我們在matlab里輸入 help format,看看官方的解釋,

點進參考頁,我們找到hex的有關解釋,發現人家的官方解釋并不是“十六進制表示”,而是“二進制雙精度數字的十六進制表示形式”,本能的直覺告訴我,問題就出在這個“二進制雙精度數字”上,那么他到底是何方神圣呢?
2、二進制雙精度數字
百度百科對于“二進制雙精度數字”的解釋:
雙精度浮點數(double)是計算機使用的一種資料型別,使用 64 位(8位元組) 來存盤一個浮點數,C、C++中使用到的雙精度浮點數(double)型別是在IEEE二進制浮點數算術標準中定義的,
3、IEEE二進制浮點數算術標準
IEEE二進制浮點數算術標準是一種科學計數法,用符號、指數和尾數來表示,下面是具體的規格:

- double型別共計64位,折合8位元組,由最高到最低位分別是第63、62、61、……、0位,
- 最高位63位是符號位,1表示該數為負,0表示該數為正,
- 62-52位,一共11位是指數位,可以表示范圍是-1024 ~ 1023,因為指數可以為負,為了便于計算,規定都先加上1023( 2 10 ? 1 2^{10}-1 210?1)
- 51-0位,一共52位是尾數位,由于浮點數精度問題,整數部分與小數部分一共算夠53位即可,最高位的1不寫入記憶體(最終保留下來的還是52位),
下面通過兩個例子來說明,
二、16->4030000000000000
16(D)->1 0000(B),- 假設
16(D)的雙精度IEEE二進制表示為:xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx(B), - 因為
16(D)為正數,第一位符號位為0:0xxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx(B), 1 0000(B)的科學計數法表示為1*2^4(B),指數4,尾數1,按照規定,指數為4+1023=1027(D)->100 0000 0011(B),尾數最高位1省去,所以只剩下0:0100 0000 0011 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 (B),0100 0000 0011 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 (B)->4030 0000 0000 0000(H)
三、 π \pi π ->400921fb54442d18
3.141592653589793(D)->1 1.001 0010 0001 1111 1011 0101 0100 0100 0100 0010 1101 0001 1000(B),- 假設
3.1415926535898(D)的雙精度IEEE二進制表示為:xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx(B), - 因為
3.1415926535898(D)為正數,第一位符號位為0:0xxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx(B), 1 1.001 0010 0001 1111 1011 0101 0100 0100 0100 0010 1101 0001 1000(B)的科學計數法表示為1. 1001 0010 0001 1111 1011 0101 0100 0100 0100 0010 1101 0001 1000*2^1(B),指數1,尾數1. 1001 0010 0001 1111 1011 0101 0100 0100 0100 0010 1101 0001 1000,按照規定,指數為1+1023=1024(D)->100 0000 0000(B),尾數最高位1省去,所以只剩下1001 0010 0001 1111 1011 0101 0100 0100 0100 0010 1101 0001 1000:0100 0000 0000 1001 0010 0001 1111 1011 0101 0100 0100 0100 0010 1101 0001 1000 (B),0100 0000 0000 1001 0010 0001 1111 1011 0101 0100 0100 0100 0010 1101 0001 1000 (B)->4009 21FB 5444 2D18(H),
碼文不易,如果覺得對你有用的話,點個贊再走吧,謝謝寧!
(才疏學淺,如果有什么說的不對的地方,歡迎大家在評論區或者私信進行指正,)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/249469.html
標籤:其他
上一篇:C語言編程>第十六周 ④ 請補充fun函式,該函式的功能是將字串str中的小寫字母都改為對應的大寫字母,其它字符不變。
下一篇:sqrt函式
