日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

有符号数与无符号数

發布時間:2025/4/5 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 有符号数与无符号数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1 有符號數
      • 1.1 有符號數的表示
      • 1.2 計算負數的補碼的兩種方法
      • 1.3 經典的有符號數問題
    • 2 無符號數
      • 2.1 無符號數的表示方法
      • 2.2 C語言中的signed和unsigned
      • 2.3 當無符號數遇見有符號數
      • 2.4 錯誤的使用了unsigned

1 有符號數

1.1 有符號數的表示

有符號數在計算機內部用補碼表示:

  • 正數的補碼為正數本身。
  • 負數的補碼為負數的絕對值各位取反后加1。

比如:

  • 8位整數5的補碼為:0000 0101
  • 8位整數-7的補碼為:1111 1001
  • 16位整數20的補碼為:0000 0000 0001 0100
  • 16位整數-13的補碼為:1111 1111 1111 0011

1.2 計算負數的補碼的兩種方法

以8位整數-7為例:

負數的絕對值各位取反后加1:

  • -7的絕對值為7,二進制為:0000 0111
  • 各位取反:1111 1000
  • 加1:1111 1001
  • 負數的絕對值從最低位開始第一個不為0的位之后各位取反:
    4. -7的絕對值為7,二進制為:0000 0111
    5. 取反:1111 1001

    1.3 經典的有符號數問題

    下面會輸出啥?

    void test35() {int a;char c = 0xaa;if (c == 0xaa){cout << "c == 0xaa" << endl;}else{cout << "c != 0xaa" << endl;} }

    我以為輸出"c == 0xaa",可是編譯器卻輸出了"c != 0xaa"!事出反常必是我菜雞,看看反匯編吧:


    2 無符號數

    2.1 無符號數的表示方法

    在計算機內部用原碼表示無符號數:

    • 無符號數默認為正數。
    • 無符號數沒有符號位。

    對于固定長度的無符號數:

    • MAX_VALUE + 1 ? MIN_VALUE
    • MIN_VALUE - 1? MAX_VALUE

    2.2 C語言中的signed和unsigned

    C語言中的變量默認為有符號類型,我們可以使用unsigned關鍵字聲明變量為無符號類型。


    C語言中只有整數類型能夠聲明unsigned變量。

    2.3 當無符號數遇見有符號數

    當無符號數與有符號數混合計算時,會將有符號數轉換為無符號數后再進行計算,結果為無符號數。

    #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

    2.4 錯誤的使用了unsigned

    #include <stdio.h>int main() {unsigned int i = 0;for(i=9; i>=0; i--){printf("i = %u\n", i);}return 0; }

    如上程序將是死循環!unsigned類型的變量永遠不可能小于0。


    參考資料:

  • C語言進階剖析教程
  • 總結

    以上是生活随笔為你收集整理的有符号数与无符号数的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。