赞
踩
数据的截断和扩展
数据的扩展: 在数据扩展的时候,需要将数据扩展成字符数更长的数据的时候,一般低位都保持不变,继续保留原有的数据,多出的高字节数据,需要根据当前被扩展数据进行不同的填充。
数据的截断:数据截断就是根据要求,将数据的高字节数据截去,只保留低字节部分。
为了深刻的理解我们在下边例题里边领会吧。
#include <stdio.h>
int main() {
char a = -128;
unsigned char b = -128;
printf("%u\n",a);
printf("%d\n",a);
printf("%u\n",b);
printf("%d\n",b);
return 0;
}
-128为常量在计算机中一般用int类型存储它的 原码,反码,补码分别为:
原码1000 0000 0000 0000 0000 0000 1000 0000
反码1111 1111 1111 1111 1111 1111 0111 1111
补码1111 1111 1111 1111 1111 1111 1000 0000(在计算机中是以补码存储的)
变量a是char类型的数据,b是unsigned char型的数据, -128是int型,将int型付给char型和unsigned char 时,都会用到数据的截断:也就是把-128补码的低八位(1000 0000)赋于a和b然后打印,在这里a,b里边存储的数据是完全一样的。
在打印时(%u是指将数用 unsigned int类型输入或输出,%d 是指将数据用 int型输入或输出 )所以这里涉及数据的扩展,扩展根据要扩展的数据,的数据类型可分为两类
(1)无符号数的扩展:b(unsigned int)是无符号类型的数据,它的扩展比较简单直接在多余的位数补零就好了;在题目中就会变成(0000 0000 0000 0000 0000 0000 1000 0000)
(2)有符号数的扩展:a(int)是有符号类型的数据,既然是要扩展为有符号数,那么就在多余位补上该数的符号位(a的符号位为1)结果为(1111 1111 1111 1111 1111 1111 1000 0000);
扩展完后
printf("%u\n",a);把a当做无符号数打印 那么1111 1111 1111 1111 1111 1111 1000 0000对应的就是一个很大的数4294967168
printf("%d\n",a)把a当做有符号数打印 那么1111 1111 1111 1111 1111 1111 1000 0000 是补码减一取反后的结果为-128
printf("%u\n",b);把b当做无符号数打印 那么0000 0000 0000 0000 0000 0000 1000 0000对应的就是128
printf("%u\n",b);把b当做无符号数打印 那么0000 0000 0000 0000 0000 0000 1000 0000正数的补码就是它本身 对应的就是128
总结:
这里特别容易混淆的是%u和%d 他们给予扩展的信息是一样的 ,而扩展时要补0还是要补1要看被扩展的数是有符号类型的数据还是无符号类型的数据。(有符号类型的数据补符号位,无符号的数据补0)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。