1.6 signed、unsigned 关键字
规则:单纯的char 类型应该只用于字符值的存储和使用;有符号和无符号的 ”char“ 型变量只能用于数值的存储和使用。
char 有三种不同的类型:单纯 char 、signed char 及 unsigned char 。signed char 和 unsigned char 类型是用来声明数值的; 单纯 char 类型是真正的字符类型, 是用来声明字符的。单纯 char 类型有编译器环境决定,不能依赖。对于单纯 char 型,唯一允许的操作是赋值和相同运算符(=、==、!=)。
3个问题:
1、-0 和 +0 在内存里分别是怎么存储的?
答:由于在计算机中数值的存储都是以补码的形式存储的,所以-0 和 +0 在内存中都是按0000 0000存储的(如果是char类型)。
2、int i = -20; unsigned j = 10; i+j的值为多少?为什么?
答:如若按 %d 输出为 -10;按 %u 输出为一个很大的值。i + j 在这里做了隐式的转换
隐式转换各数据类型的级别高低。
隐式转换规则如下:
1. 程式在执行算术运算时,低类型能够转换为高类型。
2. 在赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给他。
3. 当在函数调用时,将实参值赋给形参,系统隐式地将实参转换为形参的类型后,赋给形参。
4. 函数有返回值时,系统将自动地将返回表达式类型转换为函数类型后,赋值给调用函数。
3、下面代码有什么问题?
unsigned i; for(i = 9; i >= 0; i--) { <span style="white-space:pre"> </span>printf("%u \n", i);
答:输出的值为极大的值;主要原因是在输出时 %u 将 9 这个数值由 int 型转换为 unsigned 类型,编译器会把它当作一个很大的值。}
1.7 if 、else 组合
a.对于bool类型的比较:FLASE都是0 TRUE不一定是1 所以应该用if(bool_num); if(!bool_num);对于浮点型与0比较要是否注意:不能直接比较,要定义精度,其实浮点型与浮点型比较也要注意这个问题,就是不能直接比较,要设定精度,如图: