對於一個字節來說:
unsigned char : 0 ~ 255 0000 0000 ~ 1111 1111
char :-128 ~ 127 -128 ~ -1 1000 0000 ~ 1111 1111 0 ~ 127 0000 0000 ~ 0111 1111
(-128 的補碼是1000 0000,它沒有對應的原碼、反碼,其推導是根據 -128 + 127 = -1,即1000 0000 + 0111 1111 = 1111 1111)
計算機CPU只有加法邏輯運算器,對於減法運算,是使用兩個數的補碼進行加法運算。
1 #include "stdafx.h" 2 #include <stdio.h> 3 4 void print_2(unsigned char val2) 5 { 6 unsigned char *p = (unsigned char*)&val2; //從低位到高位,低端字節計算機 7 8 for (int i = 7; i >= 0; i--) 9 { 10 if(val2 & (1 << i)) 11 printf("1"); 12 else 13 printf("0"); 14 } 15 printf(" "); 16 17 } 18 19 int main(int argc, char **argv) 20 { 21 unsigned char a = 1; //補碼:0000 0001 22 unsigned char b = 2; //補碼:0000 0010 23 unsigned char c = a - b; //補碼:0000 0001 + (-2)1111 1110 = (-1)1111 1111 24 25 printf("%02x,%02x,%02x\n", a, b, c); 26 printf("%d,%d,%d\n", a, b, c); 27 print_2(a); 28 print_2(b); 29 print_2(c); 30 31 char d = a - b; 32 printf("\n%d\n", d); 33 34 getchar(); 35 }
內存中的數據結果是 1111 1111 ,如果按照unsigned char 解釋即為255,按照char 解釋則為 -1。