数据压缩(一)

  • 数据压缩·课前任务一
    总结归纳计算机编程中各种数据类型,包括其表示形式和计算方法(即如何求每种数据类型的取值范围),重点关注类型转换、数值溢出和移位等操作。

由于该课程使用C语言,便以C语言为例,实际上不同变成语言的数据类型和表示形式等会存在一定区别


·C中各种数据类型的表示形式和取值范围
在这里插入图片描述
-各数据类型取值范围的计算方法:

	整型、字符型:
      有符号型:-2^(x-1) ~ 2^(x-1)-1
	  无符号型: 0~2^(x)-1
	 ( x为该数据类型的位数,与系统的位数有关,1字节=8位)
	 浮点型:注意取值范围的下界与和float的最小值不是一回事。
	   float 最小值: 1.175494e-38
	   float 最大值: 3.402823e+38

参考资料link.

//可用该程序输出浮点型占用的存储空间及它的最大最小值
#include <stdio.h>
#include <float.h> //注意这个头文件
 
int main()
{
   printf("float 存储最大字节数 : %lu \n", sizeof(float));
   printf("float 最小值: %E\n", FLT_MIN );//%E 为以指数形式输出单、双精度实数
   printf("float 最大值: %E\n", FLT_MAX );
   printf("精度值: %d\n", FLT_DIG );
   
   return 0;
}
//编译并执行上面的程序时,它会产生下列结果:
float 存储最大字节数 : 4 
float 最小值: 1.175494E-38
float 最大值: 3.402823E+38
精度值: 6

·类型转换
若一个表达式中含有不同类型的常量和变量,在计算时,会将它们自动转换为同一种类型也可以对数据类型进行强制转换

  1. 自动转换规则:浮点数赋给整型,该浮点数小数被舍去;整数赋给浮点型,数值不变,但是被存储到相应的浮点型变量中.
  2. 强制类型转换形式: (类型说明符)(表达式).
//举例
#include<stdio.h>

int main()
{
    float f,g,x=3.6,y=5.4;
    int i=4,a,b;
    a=x+y;
    b=(int)(x+y);
    f=10/i;
	g=10.0/i;
    printf("a=%d,\nb=%d,\nf=%f,\ng=%f,\nx=%f",a,b,f,g,x);
	return 0;
}
//编译并执行上面的程序时,它会产生下列结果:
a=9,
b=9,
f=2.000000,
g=2.500000,
x=3.600000

·数值溢出

  • 整型溢出
    整数的溢出,当达到最大值时,将会溢出到起始点;当达到最小值时,将会从最大点开始往变小方向溢出。
  1. 无符号整型溢出:
    溢出后的数会以2^(8*sizeof(type))作模运算,也就是说,如果一个unsigned char(1字符,8bits)溢出了,会把溢出的值与256求模。如:
#include<stdio.h>
int main()
{
    unsigned char x = 255;
	printf("%d", ++x);
	return 0;
}
//上面的代码会输出:0 (因为255 + 1=256,与2^8求模后就是0)
  1. 有符号整型溢出:
    C的规范定义是“undefined behavior”,也就是说,编译器爱怎么实现就怎么实现。如:
#include<stdio.h>
int main()
{
   signed char x =127; 
   printf("%d", ++x);
	
	return 0;
}
//上面的代码会输出:-128,因为127 + 1=128,也就是二进制的1000 0000,符号位为1,负数,后面为全0,就是负的最小数,即-128。
  • 浮点型溢出
    浮点数上溢时,被赋予一个无穷大的值,printf函数显示的是inf。

·移位操作
整型、字符型移位:逻辑移位。
左移<<
二进制数按位向左移动,丢弃最高位,低位补0,即十进制数乘2。
右移>>
二进制数按位向右移动,即十进制数除以2;
对于有符号数,正数补0,负数补1。

左移和右移运算过程中也会发生溢出,移位位数并不是可以任意。当移位位数超过该数值类型的最大位数时,编译器会用移位位数去模该类型位数,然后按照余数进行移位。

int main()
{
  int i=1;
  //char i=1;
  i=i<<33;
  printf("%d\n",i);
  return 0;
}
 
结果:2
//左移位数为33,变量i为32位,故左移位数实际为:33%32=1,结果为2

浮点数不能进行移位操作。

发布了2 篇原创文章 · 获赞 0 · 访问量 91

猜你喜欢

转载自blog.csdn.net/qq_42949426/article/details/104352274