999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

用VB編程實現IEEE 754浮點數與十六進制格式轉換

2017-12-19 12:25:04劉青青
科學與財富 2017年33期

劉青青

摘 要: IEEE浮點數算術標準(IEEE 754)是最廣泛使用的浮點數運算標準,為許多CPU與浮點運算器DSP所采用。而在實際工程應用上,比如計算機串口通訊中數據都是以十六進制數據打包、解析和傳輸的,所以研究如何根據該標準把所要傳輸的浮點型數據編程轉換成十六進制數據具有重要的實用意義。這里在分析和研究了IEEE 754標準中浮點型數據表示方式和存儲方式的基礎上,結合Visual Basic 6.0 可視化編程工具,闡述了如何把單/雙精度浮點型數據轉換成十六進制數,以及逆過程把十六進制數轉換成單/雙精度浮點類型數據的簡便方法。

關鍵詞: IEEE 754 標準;十六進制數;單精度浮點數;VB

0 引言

IEEE 754規定了四種表示浮點數值的方式:單精確度(32位)、雙精確度(64位)、延伸單精確度(43位以上)與延伸雙精確度(79位元以上,通常以80位元實做)。只有32位模式有強制要求,其他都是選擇性的。大部分編程語言都有提供IEEE格式與算術,但有些將其列為非必要的。例如,IEEE 754問世之前就有的C語言。IEEE754標準包括IEEE算術,但不算作強制要求(VB語言的single通常是指IEEE單精度,而double是指IEEE雙精度)。

VB是Visual Basic 的簡稱,在編程語言中屬于較簡單易于學習掌握的一類,由微軟公司開發研制,已經得到了廣泛的應用,VB主要擁有 GUI 系統( 即圖形用戶界面) 以及RAD系統( 快速應用程序開發) 等。VB編程語言在開發時,依據的原則就是為了方便程序開發人員使用,所以 VB語言是面向對象的基于窗口可視化的編程語言,在組件內已經定義了部分默認的方法和屬性,也可以通過增加代碼的方式來指定組建方法和屬性,方便編程人員使用。在 VB編程語言中,對一個對象的描述主要通過描述事件、方法和屬性的方式就可以完成。

1 轉換方法闡述

浮點型數據保存的格式如表 1 所示。其中:S 表示符號位;“1”表示負數;“ 0”表示正數;E 代表偏移 127 的冪數,二進制階碼 =(EEEE EEEE)-127;M 代表 24 位的尾數,存放在 23 個位中,只存儲 23 位,最高位固定為 1,此方法用最少的位數實現了較高的有效位數,提高了精度“0”是一個特定值,冪數是0,尾數也是 0。

采用標準算法,需要對數據按位進行運算,這里不再介紹。本文采用一種創新的思路,可以更簡便的實現數據轉換。

這里首先以單精度浮點數為例進行分析,例如把浮點數112.3456789賦值給一個單精度變量F1,那么這個浮點數F1在計算機內存中占用4個字節存儲單元,每字節8位。為提高可讀性,我們把變量F1在內存單元中的存儲格式用圖形化為圖1所示。

再定義一個十六進制數組AA,并使得數組首個數據元素AA(0)的內存地址映射為0x1000,也就是與浮點數F1的起始存儲地址相同,那么數組AA的每個元素就對應該內存地址起始的4個存儲單元,由此就可以實現單精度浮點數F1與16進制數組AA的轉換了。

雙精度數據也可以采用這種方法,只不過雙精度數據所占用的存儲單元為8個字節,就不在贅述了。

由于在VB6.0編程語言的局限性,無法對變量和數組的內存地址直接進行映射,因此無法直接從變量F1得到數據AA。但VB6.0可以利用API函數copymemory,將變量F1內存起始地址的數據復制到數組AA的內存起始地址上,也可以反過來將數組AA內存起始地址的數據復制到變量F1的內存起始地址上,從而就可以實現單精度浮點數與十六進制數據的轉換。

2 編程實現

打開VB6.0編程軟件,新建一個工程,如圖2所示,在窗體form1上放置文本框Text1、文本框數組Text2和按鈕Command1,用來將單精度浮點數轉換為十六進制數。再放置文本框數組Text3、文本框Text4和按鈕Command2,用來將十六進制數轉換為單精度浮點數。

源程序如下:

Private Declare Sub copymemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal length As Long)

'聲明API函數,它有3個參數, Destination代表目標內存地址,Source代表源內存地址,length代表需要復制的字節數

Private Sub Command1_Click()

Dim F1 As Single ‘定義一個單精度浮點數變量

Dim AA(4) As Byte ‘定義一個十六進制數組變量

F1 = Val(Text1) ‘將文本框中的數賦值給變量F1

copymemory ByVal VarPtr(AA(0)), ByVal VarPtr(F1), 4

‘把浮點數F1所在內存的4個字節賦值給數組AA

For i = 0 To 3

Text2(i) = Hex(AA(i)) ‘將數據按從低到高的順序以十六進制顯示出來

Next i

End Sub

Private Sub Command2_Click()

Dim F2 As Single ‘定義一個單精度浮點數變量

Dim BB(4) As Byte ‘定義一個十六進制數組變量

BB(0) = "&h" + Text3(0) ‘將十六進制數據賦值給數組BB

BB(1) = "&h" + Text3(1)

BB(2) = "&h" + Text3(2)

BB(3) = "&h" + Text3(3)

copymemory ByVal VarPtr(F2), ByVal VarPtr(BB(0)), 4

‘把數組BB所在內存的4個字節賦值給浮點數F2

Text4 = F2 ‘將轉換后的浮點數顯示在文本框里

End Sub

最后,按F5運行該程序,計算結果如圖3所示。

3 結論

本文利用Visual Basic 6.0編程開發環境完成了十六進制整型數據和單精度浮點型數據相互轉換,可被用于串口通信中單精度浮點型數據的傳輸打包、解析和顯示。此方法對于雙精度浮點數的轉換也同樣有效,只需要將程序中的4字節數組定義為8字節數組,并將copymemory函數的第三個參數由4改為8即可。

參考文獻

[1] 程展鵬.Borland C++ Builder 6 應用開發技術解析[M].北京:清華大學出版社, 2003.

[2] 黃藝坤.VB 編程語言在軟件開發中的應用探究[J].建材與裝飾,2012,8: 173.

[3] 丁龍.基于 VB 的定制軟件開發與應用[J]. 軟件開發與設計,2012,12: 23 - 24.

主站蜘蛛池模板: 特级毛片免费视频| 亚洲综合香蕉| 精品国产成人av免费| 国产拍揄自揄精品视频网站| 99re在线视频观看| 久久精品aⅴ无码中文字幕| 亚洲无限乱码| 国产精品美女网站| 国产成人精品无码一区二| 五月婷婷精品| 高清久久精品亚洲日韩Av| 中文字幕永久视频| 亚洲一区二区三区中文字幕5566| 伊人久久婷婷| 国产aⅴ无码专区亚洲av综合网| 亚洲精品第一在线观看视频| 日韩在线网址| 自拍偷拍欧美日韩| 日本影院一区| 国产视频你懂得| 国产精品免费p区| 日韩欧美在线观看| 亚洲欧美日韩色图| 欧美区一区| 亚洲天堂网站在线| 久久综合AV免费观看| 成年人免费国产视频| 成人欧美日韩| 国产后式a一视频| 久久窝窝国产精品午夜看片| 欧美成人在线免费| 亚洲天堂日韩在线| 中文字幕一区二区人妻电影| AV无码无在线观看免费| 国产97公开成人免费视频| 国产福利在线免费观看| 亚洲永久免费网站| 自偷自拍三级全三级视频 | 欧美h在线观看| 久久久精品国产SM调教网站| 亚洲精品少妇熟女| 99re这里只有国产中文精品国产精品 | 国产夜色视频| 性网站在线观看| 国产正在播放| 亚洲国产成人无码AV在线影院L| 免费人成视网站在线不卡| 99久视频| a毛片基地免费大全| 免费av一区二区三区在线| 99久久国产综合精品2020| 国产真实乱了在线播放| 97se亚洲| 日韩视频免费| 97超碰精品成人国产| 欧洲日本亚洲中文字幕| 欧美成人aⅴ| 精品人妻系列无码专区久久| 99ri精品视频在线观看播放| 久久婷婷色综合老司机| 亚国产欧美在线人成| 99久久这里只精品麻豆| 色天堂无毒不卡| 免费在线不卡视频| 国内精品自在自线视频香蕉| 久久久久中文字幕精品视频| 久久99精品久久久久纯品| 亚洲天堂网2014| 中文字幕丝袜一区二区| 国产一在线| 91久久性奴调教国产免费| 一级毛片视频免费| 91偷拍一区| 狠狠色丁香婷婷综合| 久久伊伊香蕉综合精品| 亚洲中文字幕手机在线第一页| 国产69囗曝护士吞精在线视频| 69视频国产| 91久久偷偷做嫩草影院精品| 欧美伊人色综合久久天天| 欧美亚洲一区二区三区在线| 米奇精品一区二区三区|