為什么不建議使用無符號整型,無符號整型能產生哪些bug?
《C專家編程》有這么幾行代碼。
#include一個數組,一個宏定義,宏的作用就是計算數組的元素個數。int array[] = {23, 34, 12, 17, 204, 99, 16}; #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0])) int main() { int d = -1, x; /* ... */ if (d <= TOTAL_ELEMENTS - 2) x = array[d + 1]; /* ... */ return 0; }
主函數里面d初始化成-1,判斷語句中用 d 跟 TOTAL_ELEMENTS - 2做比較,如果成立,則給 x 賦值。
代碼很簡單,乍一看,-1 確實小于 5,于是判斷語句肯定成立。
問題就出在了這邊。
d屬于有符號整型,TOTAL_ELEMENTS因為是sizeof的求值結果,所以它屬于無符號整型,把這兩個放在一起運算,很顯然屬于混合運算。
一個是有符號一個是無符號,編譯器默認把有符號數轉換成無符號數,接下來我們可以算一下。
-1的二進制是這樣的:
10000000 00000000 00000000 00000001
因為負數在內存中是以補碼的形式存放,所以先轉換成反碼,再轉換成補碼。
11111111 11111111 11111111 11111110 11111111 11111111 11111111 11111111
把它轉換成無符號數字,就是最高位不再表示符號位,全部用來表示實際大小。
借助下計算器,-1轉換成無符號數就是這么大:
4294967295
所以判斷語句肯定不成立。
只要編譯器的sizeof返回的是無符號整型,那么這個bug就一直存在。
?對無符號類型的建議:
盡量不要在你的代碼中使用無符號類型,以免增加不必要的復雜性。尤其是,不要僅僅因為無符號數不存在負值(如年齡、國債)而用它來表示數量。
盡量使用像 int 那樣的有符號類型,這樣在涉及升級混合類型的復雜細節時,不必擔心邊界情況(如 -1 被翻譯為非常大的正數)。
只有在使用位段和二進制掩碼時,才可以用無符號數。應該在表達式中使用強制類型轉換,使操作數均為有符號數或者無符號數,這樣就不必由編譯器來選擇結果的類型。
嵌入式開發中使用無符號的場景很多,操作地址、寄存器等等,尤其是做單片機等等一些底層開發,隨處可見 unsigned 字樣,這也是由硬件特性決定。使用的時候多加注意,尤其是做一些基本運算的時候。
審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
嵌入式
+關注
關注
5198文章
20449瀏覽量
334036 -
寄存器
+關注
關注
31文章
5608瀏覽量
129976 -
編程
+關注
關注
90文章
3716瀏覽量
97185 -
代碼
+關注
關注
30文章
4968瀏覽量
73965
原文標題:為什么不建議使用無符號整型
文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
熱點推薦
傳遞一個無符號的 long 型指針給函數
C語言允許傳遞指針給函數,只需要簡單地聲明函數參數為指針類型即可。
下面的實例中,我們傳遞一個無符號的 long 型指針給函數,并在函數內改變這個值:
實例
#include
#include
發表于 01-27 11:51
急急急!!!如何設定列表框的輸出為數組或無符號整型?
各位大神,我在前面板上選定了列表框,用創建屬性節點的方法設置了列表框中的項目,然后設定選擇模式為2(0 or more),輸出應該是一維數組可為什么我把鼠標放在輸出端時及時幫助顯示還是有符號32位
發表于 11-09 17:33
if不能判斷有符號數的大小?編譯器bug還是我bug了。。。
,所以不發生0xff。我懷疑是if不能判斷正負,于是單獨編寫了一個函數測試,然后是能判斷正負的。所以,我目前的程序出了bug了嗎?有符號數的0xfe13絕對是個負數吧,那是哪里搞錯了呢?求大神賜教,解決完這個問題好回家過中秋啊
發表于 09-14 10:23
是否可以獲得兩個無符號數之差的無符號結果?
嗨,可能是個愚蠢的問題。我有兩個像這樣的無符號變量(XC32):當在兩個變量之間求差時,我得到一個有符號的結果(即,在某個點上可能有負值)。為了糾正這個問題,我得到了結果的絕對值。我的問題是:我
發表于 03-24 07:50
怎么通過FPGA向DSP發送有符號整型數據?
我用的是TL138EVM-F的開發板,在用FPGA和DSP通信的時候遇到點問題。我看了創龍的例程有UPP的外部回環測試,上板也驗證成功了。我現在需要做的是通過FPGA向DSP發送有符號整型數據,再
發表于 04-01 10:27
整型數據在C語言中的分類
整型數據在C語言中,數據包含整型和浮點型兩種數據,而浮點型又可以轉換為二進制,最終所有數據都會變成二進制。補充:(不考慮有無符號)整型數據:int,short,long,long lo
發表于 11-08 07:36
IAR警告:無符號整數與零的無意義比較是否合理?
;#123;}}問題無符號整型能賦值為0啊,為什么會與0比較無意義?按照警告去消除的話,就變為if(0 < x && x <= 100)
發表于 04-07 15:35
C++編程中整型數據在內存中存儲是怎么樣的
1.整型的歸類 char short int long 以上都分為有符號(signed)與無符號(unsigned)的類型 2.原碼、反碼和補碼 2.1 定義 計算機在表示一個數字時,
常見的PLC系統BUG有哪些?如何減少這些BUG的產生?
PLC系統可能會遇到各種不同類型的BUG,以下是一些常見的PLC系統BUG以及如何減少這些BUG的產生的建議: (1)邏輯錯誤:邏輯錯誤是最常見的PLC系統
常見的PLC系統BUG有哪些?如何減少BUG的產生呢?
PLC系統可能會遇到各種不同類型的BUG,以下是一些常見的PLC系統BUG以及如何減少這些BUG的產生的建議
java中長整型怎么定義
在Java中,長整型是一種數據類型,用于存儲整數值。它的取值范圍比整型要大,可以存儲更大的整數值。長整型的大小為8字節,即64位。在Java中,長整型用關鍵字"long"進行聲明和定義
無符號整型能產生哪些bug?
評論