有符号数与无符号数
文章目錄
- 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:
負數的絕對值從最低位開始第一個不為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 > 02.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。
參考資料:
總結
- 上一篇: 股票型基金申购赎回费率怎么计算?
- 下一篇: 计算机系统的发展史、基本组成、工作原理