2020.2.15 要求:总结归纳计算机编程中的各种数据类型,其表示形式和计算方法。重点关注类型转换、数值溢出和移位等操作。

2020.2.15

要求:总结归纳计算机编程中的各种数据类型,其表示形式和计算方法。重点关注类型转换、数值溢出和移位等操作。

【编程数据类型】C语言

一、基本类型
1、整型
1)、基本整型 int unsigned
2)、短整型 short unsigned short
3)、长整型 long unsigned long
2、字符型 char unsigned char
3、实型(浮点型)
1)、单精度型 float
2)、双精度型 double
4、枚举类型

二、构造类型
1、数组类型
2、结构体类型
3、共用体类型

三、指针类型
四、空类型

表示形式&计算方法
2020.2.15 要求:总结归纳计算机编程中的各种数据类型,其表示形式和计算方法。重点关注类型转换、数值溢出和移位等操作。
以上内容为word文档中手打表格,无法复制,故截图

【数据类型转换
一、在c++中的数据类型转换一般有以下几种情况:
1、将一种算术类型的值赋给另一种算术类型的变量时,c++将对值进行转换
2、表达式中包含不同的类型时,c++将对值进行转换
3、将参数传递给函数时,c++将对值进行转换

二、在进行数据类型转换的时候要注意几点:
1、将小的数据类型转化为大的数据类型,不会出现问题,一般只是转化后所占用的字节更多了,但是要将大的数据类型转化为小的数据类型的话,就会造成数据的丢失。
2、将较大的浮点数转化为较小的浮点数,如double转化为float ,这会造成精度(有效数位)降低,值可能超出目标类型的取值范围,在这种情况下,结果将是不确定的。
3、将浮点类型转换为整型,这会造成小数部分丢失,原来的值可能超出目标类型的取值范围,在这种情况下,结果将是不确定的。
4、当运算涉及到两种数据类型时,一般是较小的类型将被转换为较大的类型。

三、强制类型转换:
1、形式:
a、(typeName) value (C语言的写法)
b、value (typeName) (c++的写法)
c、static_cast<> 可以将值从一种数值类型转换为另外一种数据类型,格式为: static_cast (value)

四、数据类型大小
1、整型数据类型大小排序: bool , char ,signed char, unsigned char, short , unsigned short , int , unsigned int ,long , unsigned long ,long long , unsigned long long
2、浮点数排序大小:float , double , long double

数值溢出

1、 无符号 unsigned型
若数据溢出,即超出有效值范围(2N-1),则最终得到的结果是对2N-1取余。
例如char是一个字节,8bit,我们在采用unsigned
char的数据类型的情况下,如果我们数据产生溢出(超过28)那么我们最终得到的结果将对28(256)取余,如:
unsigned char x = 0xff;
x++;
printf("%d\n",++x);
输出的结果将是1;而不是257.

2、有符号 signed型
对于signed型的溢出,C语言的定义是Undefined
Overflow,也就是溢出的数正常显示,并不进行求余的运算。
例如:
signed char x = 0xff
printf("%d\n",x);
0xff----> 1111 1111 数在计算机的内存中是以补码的形式存在,所以次数代表的数是:1000 0001也就是-1,所以输出是-1
例如
signed char x = 0x7f
printf("%d\n",++x);
0x7f---->0111 1111 那么该数据先换算成正常的数再执行加1操作(整数的补码是本身),那么加1变成:1000 0000这是-128的补码.
但是我们知道在signed char的数据中一共有8位,并且符号占1位,那么有7位数,所以最大是:0111 1111也就是127,所以128是溢出,所以我们直接显示溢出的那个数,那么上面的代码输出就是-128.

附:在#include存有各个类型的最大值和最小值
CHAR_MIN       char的最小值
SCHAR_MAX      signed char 最大值
SCHAR_MIN       signed char 最小值
UCHAR_MAX      unsigned char 最大值
SHRT_MAX       short 最大值
SHRT_MIN       short 最小值
USHRT_MAX      unsigned short 最大值
INT_MAX       int 最大值
INT_MIN        int 最小值
UINT_MAX       unsigned int 最大值
UINT_MIN       unsigned int 最小值
LONG_MAX      long最大值
LONG_MIN       long最小值
ULONG_MAX      unsigned long 最大值
FLT_MANT_DIG    float 类型的尾数
FLT_DIG        float 类型的最少有效数字位数
FLT_MIN_10_EXP   带有全部有效数的float类型的负指数的最小值(以10为底)
FLT_MAX_10_EXP    float类型的正指数的最大值(以10为底)
FLT_MIN        保留全部精度的float类型正数最小值
FLT_MAX        float类型正数最大值

移位
位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算。位移位运算符分为左移和右移两种,均为双目运算符。第一运算对象是移位对象,第二个运算对象是所移的二进制位数。
移位时,移出的位数全部丢弃,移出的空位补入的数与左移还是右移花接木有关。如果是左移,则规定补入的数全部是0;如果是右移,还与被移位的数据是否带符号有关。若是无符号数,则补入的数全部为0;若是有符号数,则补入的数全部等于原数的最左端位上的原数(即原符号位)
位移位运算符的优先级如下:算术运算符 优先于 位移位运算符 优先于 关系运算符。位移位运算符是同级别的,结合性是自左向右

1、左移运算
左移运算符“<<”是双目运算符。其功能把“<<”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。
例如: a<<4 指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。
左移里一个比较特殊的情况是当左移的位数超过该数值类型的最大位数时,编译器会用左移的位数去模类型的最大位数,然后按余数进行移位,如:
int i = 1, j = 0x80000000; //设int为32位
i = i << 33; // 33 % 32 = 1 左移1位,i变成2
j = j << 33; // 33 % 32 = 1 左移1位,j变成0,最高位被丢弃

2、右移运算
右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。
例如:设 a=15,a>>2 表示把000001111右移为00000011(十进制3)。
对于有符号数,在右移时,符号位将随同移动。当为正数时, 最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。
右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如:
int i = 0x80000000;
i = i >> 1; //i的值不会变成0x40000000,而会变成0xc0000000
就是说,符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位.
负数10100110 >>5(假设字长为8位),则得到的是11111101

总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多.