当前位置:   article > 正文

数据的截断和扩展_数据截断

数据截断

数据的截断和扩展
数据的扩展: 在数据扩展的时候,需要将数据扩展成字符数更长的数据的时候,一般低位都保持不变,继续保留原有的数据,多出的高字节数据,需要根据当前被扩展数据进行不同的填充。
数据的截断:数据截断就是根据要求,将数据的高字节数据截去,只保留低字节部分。
为了深刻的理解我们在下边例题里边领会吧。

#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;
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

-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)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/272372
推荐阅读
相关标签
  

闽ICP备14008679号