無符號串行號溢位問題

2021-07-26 15:55:36 字數 616 閱讀 9677

在系統實現中,經常需要用到序列號來記錄操作執行的順序或者列印時間戳等。因為序列號等我們只取正值,所以一般都使用無符號數以表示更大的範圍。雖然一般的32位或者64位無符號數表示的範圍很大,甚至可以確保在系統的生命週期內都不會用完,但是作為乙個健壯的系統還是需要考慮無符號數達到最大後,重新歸零的溢位問題。

此時有乙個比較簡單的轉換可以用來規避該問題。在比較兩個序列號的大小時,使用以下 before 內聯函式即可,如果 seq1 小於 seq2 將返回正數,如果 seq1 大於等於 seq2 將返回負數。

static inline int before(uint32_t seq1, uint32_t seq2)

乍一看,將兩個 uint32_t 相減的結果轉換為 int32_t 之後會有溢位的問題,因為乙個很大的32位無符號整數減去乙個很小的32位無符號整數,在轉換後會變成負數。而這正是解決無符號數溢位問題的關鍵。此處隱含了乙個預設的前提,即在使用 before 函式判斷序列號時,需要保證進行判斷的序列號是相鄰出現的,至少其差異不會跨越整個無符號數表示範圍的一半,這也常常是符合我們使用序列號的習慣的。這樣即使無符號數溢位真的發生了,我們通過 before 函式進行序列號比較時,就仍能得到正確的結果。

9 符號串行

題目 乙個字串裡只有 這6個符號,每隊各自前後匹配,問這個字串是不是匹配的。如 是匹配的,是不匹配的。public boolean isvalid string s 思路 用棧存放,拿棧頂元素和下乙個元素比較,如果匹配的話pop棧頂元素,如果不匹配就放到棧裡。最後如果完全匹配了,棧為空,否則就沒有完...

無符號數相減溢位

u16 a 190 u16 b 1020 u16 c 0 c a b c 0xfcc2 微控制器採用補碼運算,需要程式設計師認為識別是有符號數還是無符號數。通過最高bit判斷。相差不大取上一次的值 if fluor value 100x backup fluor value 100x 用減法處理會有...

無符號和有符號數底層溢位判斷

無符號和有符號數進行運算,在機器層面上所做運算相同,編譯器區分兩種運算是否溢位,依賴於cf carry flag 和of over flag 位。最高位出現進製置1,否則置0。例 1000 cf置1 1 0000 最高位和次高位進製不同置1,相同置0。例 1000 of置1 1 0000 1100 ...