C語言進階——有符號與無符號02
阿新 • • 發佈:2018-06-19
開始 有符號 分析 ack 方式 pri 位運算 運算 pan
在計算機的內部,我們所有的信息都是由二進制數字組成的
有符號數的表實法:
- 在計算機內部用補碼的方式表實有符號數
- 正數的補碼位正數的本身
- 負數的補碼為其絕對值取反然後加一得到
例如-7 他在計算機內部的是1111 1001 是這樣得到的 7-》111-》0000 0111-》1111 1000-》1111 1001
無符號整數的表示:
- 在計算機內部用原碼表實無符號整數
- 無符號整數默認為正數
- 無符號整數沒有符號位
對於固定長度的無符號整數:
- max+1=min
- min-1=max
C語言中默認為有符號類型,可以通過unsigned來聲明無符號類型的整數,特別註意,只有整數可以聲明為無符號整數,浮點數沒有無符號類型
代碼示例1:
#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 )); return 0; }
這裏面可以通過與(位運算)來實驗最高位是0還是1
代碼示例2:
#include <stdio.h> intmain() { unsigned int i = 5; int j = -10; if( (i + j) > 0 ) { printf("i + j > 0\n"); } else { printf("i + j <= 0\n"); } return 0; }
這段代碼我們應該仔細分析一下,-10+5應該是個負數,可是為什莫會打印 i+j>0。因為在計算無符號和有符號類型做運算時,計算機會把有符號轉化為無符號然後才開始進行計算
示例代碼3:
#include <stdio.h> intmain() { unsigned int i = 0; for(i=9; i>=0; i--) { printf("i = %u\n", i); } return 0; }
這段代碼錯誤的使用了無符號類型,導致不會退出循環,因為無符號類型你0-1後又是一個很大的正數
dfsaf
C語言進階——有符號與無符號02