中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C之有符號與無符號(二)

發布時間:2020-03-31 08:10:56 來源:網絡 閱讀:1774 作者:上帝之子521 欄目:編程語言

        我們在 C 語言中經常會見到 unsigned 關鍵字,那么這是什么意思呢?在計算機內,數據類型分為有符號和無符號兩種類型。它的最高位用于標識數據的符號:如果最高位為 1,表明這個數為負數;如果是0的則表明這個數為正數。那么我們就來做個試驗驗證下,代碼如下所示:

#include <stdio.h>

int main()
{
    char c = -5;
    short s = 6;
    int i = -7;
    
    printf("c : %d\n", ( (c & 0x80) != 0 ));
    printf("s : %d\n", ( (s & 0x8000) != 0 ));
    printf("i : %d\n", ( (i & 0x80000000) != 0 ));
    
    return 0;
}

        c 為負數最高位為1,理論上 & 之后應該不等于0,所以打印的會是1;s 為正數最高位為0,,理論上 & 之后應該等于0,打印的會是0;i 位負數,會打印1。下來我們在 Linux 環境中用 gcc 編譯下,看看結果是否和我們分析的一致,結果如下:

C之有符號與無符號(二)

        我們打印的結果也從側面證實了我們的分析是對的。那么在計算機內部是怎樣表示有符號數的呢?答案用補碼來表示,正數的補碼為正數本身,負數的補碼為負數的絕對值各位取反后加1。我們來分析下 -7 的補碼是多少?

        -7 ==> |-7| + (末位+1)==> 111 + 1==> 0000 0111 + 1 ==> 1111 1000 + 1 ==> 1111 1001

這是我們分析的結果,那么我們用計算器轉換下看看,是否和我們分析的一致呢?

C之有符號與無符號(二)C之有符號與無符號(二)

        我們看到結果和我們分析的是一致的。在計算機內部用原碼表示無符號數,無符號數默認為正數,無符號數沒有符號位。對于固定長度的無符號數,MAX_VALUE + 1 ==> MIN_VALUE,MIN_VALUE - 1 ==> MAX_VALUE。

        在 C 語言中變量默認為有符號的類型,unsigned 關鍵字聲明變量為無符號類型。注意:C 語言中只有整數類型能夠聲明 unsigned 變量。下來我們再做個試驗,代碼如下:

#include <stdio.h>

int main()
{
 
    unsigned int i = 5;
    int j = -10;
    
    if( (i + j) > 0 )
    {
        printf("i + j > 0\n");
    }
    else
    {
        printf("i + j <= 0\n");
    }
    
    return 0;
}

        我們當然會認為這個程序輸出的是 i + j <= 0,可事實是這樣嗎?我們來編譯下,得到結果如下:

C之有符號與無符號(二)

        結果和我們想的不一樣,那么這是怎么回事呢?原來在計算機內部,當有符號數和無符號數混合運算時,計算機將自動的將有符號數轉換為無符號數后再進行計算,結果為無符號數。那么這個程序輸出的結果當然是大于0的啦。

        我們在這塊要注意一個陷阱,那就是錯誤的使用了 unsigned 。我們來看這樣一個例子,代碼如下:

#include <stdio.h>

int main()
{
 
    unsigned int i = 0;
    
    for(i=9; i>=0; i--)
    {
        printf("i = %u\n", i);
    }
    
    return 0;
}

        在我們的認為中,這個程序會輸出 0-9 就完了,那么真是這樣嗎?我們編譯下,看看結果

C之有符號與無符號(二)

        結果就是如上圖所示,那么這些這么的大的數字是在哪打印出來的呢?程序在不停輸出,不得已中斷程序的運行。仔細的看看我們的示例代碼,我們定義的是 unsigned int 類型的,無符號類型的。因而它是一直大于0的,在減到0的時候,再次減1就是 2^32 - 1 了。為什么是32呢?因為在 Linux 中,int 型數據是 4 個字節,每個字節占 8 bit,所以一共占 32 bit位。

        那么我們本節學習了有符號數與無符號數。有符號數用補碼表示:正數的符號位為0,負數的符號位為1。無符號數用原碼表示:無符號數沒有符號位,無符號數只用于表示正數。unsigned 只能修飾整數類型的變量,當有符號數和無符號數混合運算時,計算機將自動的將有符號數轉換為無符號數后再進行計算,結果為無符號數。后面我們會繼續學習 C 語言的相關知識。


         歡迎大家一起來學習 C 語言,可以加我QQ:243343083

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

分宜县| 竹山县| 隆回县| 西乌| 银川市| 延安市| 得荣县| 达州市| 宁海县| 民丰县| 临高县| 巫溪县| 漠河县| 禄丰县| 垣曲县| 元谋县| 尚志市| 三亚市| 咸阳市| 大埔区| 石狮市| 潍坊市| 黄石市| 息烽县| 手游| 苗栗市| 安平县| 泰宁县| 梁山县| 朝阳市| 和田市| 水富县| 上高县| 康平县| 墨脱县| 芜湖市| 鄂温| 石台县| 宝坻区| 金川县| 建阳市|