对于一个字节来说:
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 ", a, b, c); 26 printf("%d,%d,%d ", a, b, c); 27 print_2(a); 28 print_2(b); 29 print_2(c); 30 31 char d = a - b; 32 printf(" %d ", d); 33 34 getchar(); 35 }
内存中的数据结果是 1111 1111 ,如果按照unsigned char 解释即为255,按照char 解释则为 -1。