unsigned char 无符号整形 减法运算

对于一个字节来说:

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。

计算机补码概念剖析

posted @ 2014-11-11 08:56  kira2will  阅读(4239)  评论(0编辑  收藏  举报