首頁 > 軟體

VB/VBA的無符號整數,高階應用之基礎

2021-05-16 11:30:29
VB/VBA其實是支援無符號整數滴

前言

在《VB的整數,你真的瞭解?》中,給大家介紹了VB中的數值類型除了Byte是無符號的,Integer,Single,Long,Double,Date,Currency都是有符號的。儘管這與VB的實用場景有莫大關係,但是作為一門開發語言,沒有無符號整數,是極為不方便,也是不科學的。

比如在處理ASM時,常常會遇到各種短跳,這時可能需要Byte類型的有符號類型。在進行算術運算時,也同樣需要無符號類型。比如2^31+1,按無符號是個正整數,按有符號至少也可用負數來表示吧,但對於Long類型的變數,直接就溢位了。

在《VB/VBA,請讓我點名表揚你》、《Variant構造智慧指針,撒歡了玩》等系列文章中,介紹了VB的強大,作者甚至認為VB就是VC的桌面定製版本。要說VB連無符號整數都不支援,那還如何強大?所以說,這是不可能的,本文就將給大家詳細分析VB中的無符號整數及其應用。

一、有符號和無符號的區別與聯絡

其實在《VB的整數,你真的瞭解?》裡也已給大家說了,二者在儲存層面是完全一致的,區別在於變數機制如何解釋最高Bit位。若解釋為符號位,則為有符號整數,若不解釋為符號位則為無符號整數。VB中恰巧將Byte類型的最高位不解釋為符號位,而將其他整數類型的最高位解釋為符號位。

藉助位運算和指針,從儲存角度進行處理,就可以自己解釋最高位了。但對於VB而言,這樣無疑提高了難度,顯然與VB的易用和任性風格不搭調。那有沒有VB風格的無符號整數呢?肯定是有的,但這之前需要了解VB中的進位制和端序(可閱讀《VB/VBA儲存的端序》瞭解)。

二、VB中的進位制與無符號整數

VB/VBA中提供了三種進位制,即:10進位制、16進位制和8進位制。10進位制與人的思維緊密相關,這在《新手學程式設計|系統和語言誰先有?面向過程會淘汰?》中有充分的描述。通常在編碼時,使用10進位制,可以讓程式碼更易於閱讀和維護。但計算機的發展過程中,最終選擇了有利於CPU設計的二進位制,因此計算機只認二進位制

因為16進位制和8進位制可以非常容易地轉換為2進位制,所以16進位制和8進位制就是銜接機器二進位制與人類10進位制的橋樑,不僅代表著10進位制的2進位制儲存結構,也更易於與計算機打交道(標記、儲存)。在《知VBA的浮點數結構,更懂礦機裝顯示卡》中,更是指出在計算機的世界裡,萬物皆整數。因此,使用16進位制和8進位制,就可以巧妙地藉助2進位制的儲存結構獲得無符號整數。

三、VB中的進位制轉換和表示

VB/VBA中同樣提供了10進位制與16進位制和8進位制之間的轉換函數,其中Hex函數將10進位制轉換為16進位制,Oct函數將10進位制轉換為8進位制。但有以下需要注意:

1、這兩函數轉換的10進位制,是整數。若轉換小數,則會將小數四捨五入取整後再轉換。如Hex(1.4)=1,Hex(1.5)=2,Oct(1.4)=1,Oct(1.5)=2。

2、被轉換的是有符號整數,若要超出有符號範圍,可使用相應的負數。如想獲得短整型數值65534的16進位制,可使用Hex(-2)。

3、轉換的結果是小端序的字元串類型,與整數的大端序差了點意思,也就是說轉換結果不是正整數。

既然VB中10進位制轉換為16進位制或8進位制後,連正整數都不是,又如何借其使用無符號整數呢?這就要說起16進位制和8進位制整數在VB/VBA中是如何表示的了。

在VB/VBA中通過「&H」與前述轉換的16進位制字元串連線,來表示16進位制整數,如「&HFFFE」。通過「&0」與前述8進位制字元串連線,來表示8進位制整數,如「&0177776」。如此一來,小端序變大端序,無符號整數就誕生了。

不過需要注意,"&"在較早版本的VB中是Long資料類型修飾符,這一規則在後續版本中得以保留。事實也證明,「&H」和「&0」修飾的16進位制和8進位制的無符號整數範圍不會超過4位元組無符號Long的範圍。

<點選頭像加關注,更多VB/VBA精彩內容等你來哦>


IT145.com E-mail:sddin#qq.com