水下功夫做透,水上才能顺风顺水。

变量的域内赋值和域外赋值

1.无符号数的赋值与实际值

unsigned char 是8位无符号数,不存在符号位,把符号位也当作数值位处理,表示的范围为[0,2^8-1],即[0,255]的256个数,T=2^8=256。

小于范围内的数+nT 使之在范围内,大于范围内的数-nT使之在范围内。

 1 #include <stdio.h>
 2 int main(void)
 3 {    
 4     //unsigned char-[0,FF]               
 5     unsigned char c1 = -2; 
 6     unsigned char c2 = -1; 
 7     unsigned char c3 = 255; 
 8     unsigned char c4 = 256;
 9     unsigned char c5 = 257;
10     printf("c1 = %0X\n",c1);
11     printf("c2 = %0X\n",c2);
12     printf("c3 = %0X\n",c3);
13     printf("c4 = %0X\n",c4);
14     printf("c5 = %0X\n",c5);
15     return 0;
16 
17 }

分析:

-2是负数:原码-1000 0010 补码-1111 1110  unsigned类型化原码(和补码直接相等) 1111 1110

-1是负数:原码-1000 0001 补码-1111 1111  unsigned类型化原码 1111 1111

255是正数:原码-1111 1111 补码-1111 1111 unsigned类型化原码 1111 1111

256是正数:原码-[1] 0000 0000 八位补码:0000 0000 unsigned类型化原码 0000 0000

257是正数:原码-[1] 0000 0001 八位补码:0000 0001 unsigned类型化原码 0000 0001

哲学结论:大者小之所伏,小者大之所倚。

二.有符号数的赋值与实际值

char 是8位符号数,存在1位符号位,表示的范围为[-2^7,2^7-1],即[-128,127]的256个数,T=2^8=256。

小于范围内的数+nT 使之在范围内,大于范围内的数-nT使之在范围内。

 1 #include <stdio.h>
 2 int main(void)
 3 {   //char - [-128,127]                
 4     char c1 = 127; 
 5     char c2 = 128; 
 6     char c3 = 129; 
 7     char c4 = -128;
 8     char c5 = -129;
 9     char c6 = -130;
10     printf("c1 = %d\n",c1);
11     printf("c2 = %d\n",c2);
12     printf("c3 = %d\n",c3);
13     printf("c4 = %d\n",c4);
14     printf("c5 = %d\n",c5);
15     printf("c6 = %d\n",c6);
16     return 0;
17 
18 }

分析:

 正数高位为0:原码=反码=补码

 数字->原码->补码->[原码]->数字

 127  0111 1111                 0111 1111          127

 128  0 1000 0000          [0]1000 0000 <=>1 1000 0000(CPU处理猜测) -128         

 129  0 1000 0001          [0]1000 0001          -127

-128  1 1000 0000          [1]1000 0000 <=>1 1000 0000(CPU处理猜测) -128

-129  1 1000 0001          [1]0111 1111          127

-130  1 1000 0010          [1]0111 1110          126

哲学结论:大者小之所伏,小者大之所倚。
-0        1000 0000          [1]0000 0000           0

+0       0000 0000              0000  0000          0   

 另外一种算法:

大于127的数:该数-128+(-128) = 该数 - 256 = 该数 - 2^8

小于-128的数: 该数 - (-128) +128 = 该数 + 256 = 该数 + 2^8

为什么要减去或加上256而不是255呢?

因为8bit位的char的范围是[-128,127],共2^8=256个数。

即一个周期是256,所以需要减去256。

posted @ 2015-04-01 13:51  北方寒士  阅读(342)  评论(0编辑  收藏  举报