- 最高位1, 代表這個數爲負數
- 最高位0, 標識這個數爲正數
int sign = 0; char i = -5; short j = 5; int k = -1; sign = (i & 0x80); // sign 不等於0 sign = (j & 0x8000); // sign 等於0 sign = (k & 0x80000000); // sign 不等於0
#include <stdio.h> int main() { char c = -5; short s = 6; int i = -7; printf("%d\n", ((c & 0x80) != 0)); printf("%d\n", ((s & 0x8000) != 0)); printf("%d\n", ((i & 0x80000000) != 0)); }
輸出: 1 0 1
在計算機內部使用補碼錶示有符號數編程
- 正數的補碼爲正數自己
- 負數的補碼爲負數的絕對值各位取反後加 1
在計算機內部用原碼錶示無符號數spa
- 無符號數默認爲正數
- 無符號數沒有符號位
對於固定長度的無符號數code
- MAX_VALUE + 1 => MIN_VAL
- MIN_VALUE - 1 => MAX_VAL
- C 語言中變量默認爲有符號的類型
- unsigned 關鍵字聲明變量爲無符號類型
#include <stdio.h> int main() { int i; // 默認爲帶符號整形 signed int j; // 顯示聲明爲帶符號整形 unsigned int k; // 聲明變量爲無符號整形 }
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` 分析:這不是咱們的指望, (-10 + 5) 應該是小於 0 的,爲何是這樣的輸出呢? 當無符號數與有符號數混合計算時,會將有符號數轉換爲無符號數後進行計算,結果爲無符號數。
#include <stdio.h> int main() { unsigned int i = 0; for(i=9; i>=0; i--) { printf("i = %u\n", i); } return 0; }
輸出: i = 4294934822 i = 4294934821 i = 4294934820 ...... 分析:i 爲無符號數,所以 (i >= 0) 永遠成立。
有符號數用補碼錶示it
- 正數的符號位爲0
- 負數的符號位爲1
無符號數用原碼錶示io
- 無符號數沒有符號位
- 無符號數只能用於表示正數
- unsigned 只能修飾整數類型的變量
以上內容參考狄泰軟件學院系列課程,請你們保護原創!class