欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

無符號整型能產(chǎn)生哪些bug?

學益得智能硬件 ? 來源:學益得智能硬件 ? 2023-11-09 17:09 ? 次閱讀

為什么不建議使用無符號整型,無符號整型能產(chǎn)生哪些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;
}
一個數(shù)組,一個宏定義,宏的作用就是計算數(shù)組的元素個數(shù)。

主函數(shù)里面d初始化成-1,判斷語句中用 d 跟 TOTAL_ELEMENTS - 2做比較,如果成立,則給 x 賦值。

代碼很簡單,乍一看,-1 確實小于 5,于是判斷語句肯定成立。


問題就出在了這邊。


d屬于有符號整型,TOTAL_ELEMENTS因為是sizeof的求值結果,所以它屬于無符號整型,把這兩個放在一起運算,很顯然屬于混合運算。


一個是有符號一個是無符號,編譯器默認把有符號數(shù)轉(zhuǎn)換成無符號數(shù),接下來我們可以算一下。

-1的二進制是這樣的:
10000000 00000000 00000000 00000001


因為負數(shù)在內(nèi)存中是以補碼的形式存放,所以先轉(zhuǎn)換成反碼,再轉(zhuǎn)換成補碼。
11111111 11111111 11111111 11111110
11111111 11111111 11111111 11111111


把它轉(zhuǎn)換成無符號數(shù)字,就是最高位不再表示符號位,全部用來表示實際大小。

借助下計算器,-1轉(zhuǎn)換成無符號數(shù)就是這么大:
4294967295


所以判斷語句肯定不成立。
只要編譯器的sizeof返回的是無符號整型,那么這個bug就一直存在。 344f75b8-7edf-11ee-939d-92fbcf53809c.png ?

對無符號類型的建議:

盡量不要在你的代碼中使用無符號類型,以免增加不必要的復雜性。尤其是,不要僅僅因為無符號數(shù)不存在負值(如年齡、國債)而用它來表示數(shù)量。

盡量使用像 int 那樣的有符號類型,這樣在涉及升級混合類型的復雜細節(jié)時,不必擔心邊界情況(如 -1 被翻譯為非常大的正數(shù))。

只有在使用位段和二進制掩碼時,才可以用無符號數(shù)。應該在表達式中使用強制類型轉(zhuǎn)換,使操作數(shù)均為有符號數(shù)或者無符號數(shù),這樣就不必由編譯器來選擇結果的類型。



嵌入式開發(fā)中使用無符號的場景很多,操作地址、寄存器等等,尤其是做單片機等等一些底層開發(fā),隨處可見 unsigned 字樣,這也是由硬件特性決定。使用的時候多加注意,尤其是做一些基本運算的時候。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5094

    文章

    19184

    瀏覽量

    307856
  • 寄存器
    +關注

    關注

    31

    文章

    5367

    瀏覽量

    121221
  • 編程
    +關注

    關注

    88

    文章

    3638

    瀏覽量

    94012
  • 代碼
    +關注

    關注

    30

    文章

    4830

    瀏覽量

    69091

原文標題:為什么不建議使用無符號整型

文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    急急急?。?!如何設定列表框的輸出為數(shù)組或符號整型?

    各位大神,我在前面板上選定了列表框,用創(chuàng)建屬性節(jié)點的方法設置了列表框中的項目,然后設定選擇模式為2(0 or more),輸出應該是一維數(shù)組可為什么我把鼠標放在輸出端時及時幫助顯示還是有符號32位
    發(fā)表于 11-09 17:33

    if不能判斷有符號數(shù)的大???編譯器bug還是我bug了。。。

    ,所以不發(fā)生0xff。我懷疑是if不能判斷正負,于是單獨編寫了一個函數(shù)測試,然后是判斷正負的。所以,我目前的程序出了bug了嗎?有符號數(shù)的0xfe13絕對是個負數(shù)吧,那是哪里搞錯了呢?求大神賜教,解決完這個問題好回家過中秋啊
    發(fā)表于 09-14 10:23

    脈沖波形的產(chǎn)生整型

    脈沖波形的產(chǎn)生整型
    發(fā)表于 01-21 20:33

    是否可以獲得兩個符號數(shù)之差的符號結果?

    嗨,可能是個愚蠢的問題。我有兩個像這樣的符號變量(XC32):當在兩個變量之間求差時,我得到一個有符號的結果(即,在某個點上可能有負值)。為了糾正這個問題,我得到了結果的絕對值。我的問題是:我
    發(fā)表于 03-24 07:50

    怎么通過FPGA向DSP發(fā)送有符號整型數(shù)據(jù)?

    我用的是TL138EVM-F的開發(fā)板,在用FPGA和DSP通信的時候遇到點問題。我看了創(chuàng)龍的例程有UPP的外部回環(huán)測試,上板也驗證成功了。我現(xiàn)在需要做的是通過FPGA向DSP發(fā)送有符號整型數(shù)據(jù),再
    發(fā)表于 04-01 10:27

    整型數(shù)據(jù)在C語言中的分類

    整型數(shù)據(jù)在C語言中,數(shù)據(jù)包含整型和浮點型兩種數(shù)據(jù),而浮點型又可以轉(zhuǎn)換為二進制,最終所有數(shù)據(jù)都會變成二進制。補充:(不考慮有無符號整型數(shù)據(jù):int,short,long,long lo
    發(fā)表于 11-08 07:36

    符號整形變量和一般整形變量的區(qū)別

    1.在使用單片機的時候注意符號整形變量和一般整形變量的區(qū)別2.進行比較的時候最好使用一般變量進行比較,如果原來變量是符號變量最好將其進行強制類型轉(zhuǎn)換,轉(zhuǎn)換成。一般類型變量進行比較3
    發(fā)表于 01-24 06:08

    IAR警告:符號整數(shù)與零的無意義比較是否合理?

    ;#123;}}問題符號整型賦值為0啊,為什么會與0比較無意義?按照警告去消除的話,就變?yōu)閕f(0 < x && x <= 100)
    發(fā)表于 04-07 15:35

    fpga 有符號數(shù)、符號數(shù)

    ?在設計中,所有的算數(shù)運算符都是按照符號數(shù)進行的。如果要完成有符號數(shù)計算,對于加、減操作通過補碼處理即可用符號加法完成。對于乘法操作,
    的頭像 發(fā)表于 10-09 15:22 ?6131次閱讀
    fpga 有<b class='flag-5'>符號</b>數(shù)、<b class='flag-5'>無</b><b class='flag-5'>符號</b>數(shù)

    C++編程中整型數(shù)據(jù)在內(nèi)存中存儲是怎么樣的

    1.整型的歸類 char short int long 以上都分為有符號(signed)與符號(unsigned)的類型 2.原碼、反碼和補碼 2.1 定義 計算機在表示一個數(shù)字時,
    的頭像 發(fā)表于 09-01 15:22 ?5697次閱讀

    如何取整求個符號整數(shù)的平均值

    取整求個符號整數(shù)的平均值,居然也整出花兒來?
    的頭像 發(fā)表于 03-18 10:24 ?2524次閱讀

    常見的PLC系統(tǒng)BUG有哪些?如何減少這些BUG產(chǎn)生

    PLC系統(tǒng)可能會遇到各種不同類型的BUG,以下是一些常見的PLC系統(tǒng)BUG以及如何減少這些BUG產(chǎn)生的建議: (1)邏輯錯誤:邏輯錯誤是最常見的PLC系統(tǒng)
    的頭像 發(fā)表于 10-31 11:30 ?1221次閱讀
    常見的PLC系統(tǒng)<b class='flag-5'>BUG</b>有哪些?如何減少這些<b class='flag-5'>BUG</b>的<b class='flag-5'>產(chǎn)生</b>?

    常見的PLC系統(tǒng)BUG有哪些?如何減少BUG產(chǎn)生呢?

    PLC系統(tǒng)可能會遇到各種不同類型的BUG,以下是一些常見的PLC系統(tǒng)BUG以及如何減少這些BUG產(chǎn)生的建議
    的頭像 發(fā)表于 10-31 11:29 ?957次閱讀

    java中長整型怎么定義

    在Java中,長整型是一種數(shù)據(jù)類型,用于存儲整數(shù)值。它的取值范圍比整型要大,可以存儲更大的整數(shù)值。長整型的大小為8字節(jié),即64位。在Java中,長整型用關鍵字"long"進行聲明和定義
    的頭像 發(fā)表于 11-30 11:29 ?3460次閱讀

    char是有符號類型還是符號類型?

    看一個C語言的筆試題,題目很簡單,問char是有符號類型還是符號類型?
    的頭像 發(fā)表于 03-17 10:15 ?1318次閱讀