1 有符號與無符號
阿新 • • 發佈:2020-08-29
目錄
計算機中的符號位
-
資料型別的最高位用於標識資料的符號
- 最高位為1,表明這個數為負數
- 最高位為0,表明這個數為正數
-
有符號數的符號位
#include <stdio.h> int main() { int sign = 0; //符號位 char i = -5; short j = 5; int k = -1; sign = i & 0x80; //sign 不等於 0 : sign = (1011) & (1000 0000) printf("sign = %d\n",sign); sign = j & 0x8000; //sign 等於 0 printf("sign = %d\n",sign); sign = k & 0x80000000; //sign 不等於 0 : sign = (1111 1111 1111 1111 1111 1111 1111 1111) & (1000 0000 0000 0000 0000 0000 0000 0000) = 1000 0000 0000 0000 0000 0000 0000 0000 printf("sign = %d\n",sign); return 0; } //輸出結果 sign = 128 sign = 0 sign = -2147483648##
有符號數的表示法
-
在計算機內部用補碼表示有符號數
-
正數的補碼為正數本身
-
負數的補碼為負數的絕對值各位取反後加1
-
8位整數5的補碼為:0000 0101
8位整數-7的補碼為:1111 1001
-
16位整數20的補碼為:0000 0000 0001 0100
16位整數-13的補碼為:1111 1111 1111 0011
-
無符號數的表示法
-
在計算機內部用原碼錶示無符號數
- 無符號數預設為正數
- 無符號數沒有符號位
-
對於固定長度的無符號數
- MAX_VALUE+1 -> MIN_VALUE
- MIN_VALUE-1 -> MAX_VALUE
signed 和 unsigned
-
C語言中變數預設為有符號的型別
-
unsigned
關鍵字宣告變數為無符號型別- C語言中,只有整數型別能夠宣告
unsigned
變數
#include <stdio.h> int main() { int i; //預設為帶符號整型 signed int j; //顯式宣告變數為帶符號整型 unsigned int k; //宣告變數為無符號整型 return 0; }
- C語言中,只有整數型別能夠宣告
-
當無符號數遇見有符號數
-
當無符號數與有符號數混合計算時,會將有符號數轉換為無符號數後再進行計算,結果為無符號數
-
Demo1
- 計算
i+j
時,先將int
型變數 j 轉換為unsigned int
#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
- 計算
-
Demo2
- 無限迴圈下去,因為變數 i 的值一直是無符號數,不會出現小於 0 的情況
#include <stdio.h> int main() { unsigned char i = 0; for(i=9; i>=0; i--) { printf("i = %u\n", i); } return 0; }
-