变量的域内赋值和域外赋值
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。