“知道做不到就是不知道”
一、常量
1. 整型
(1)十进制转换为二进制:除2取余法
(2)8个bit(位),变成一个byte(字节)。常见的位数:8,16,32,64
所以如果只有6个位,就需要在前面添零补齐8位:100011——00100011
(3)负数:
①原码:最高位表示符号(0
为正,1
为负),其余位表示数值的绝对值;但是相反数加和,结果≠0.
②反码:最高位依旧是符号位,值为1,数值部分按位取反(原码的绝对值取反);但相反数相加≠0.
③补码:最高位依旧是符号位,值为1
,数值部分为反码加1(即原码绝对值取反后加1
).
i.举例:5—00000101;-5—11111011
把两者相加,是可以得到“100000000”的,前面的“1”超出8个字节,去掉,直接结果=0.(perfect!!)
-
原码 → 反码:符号位不变,数值部分按位取反。
-
反码 → 补码:符号位不变,加
1
。 -
原码 → 补码:符号位不变,数值部分按位取反后加
1。
iii.用处:
①减法:计算机只会做加法,理论上的减法在计算机中只能理解为加上一个负数;
②乘法:乘2,左移一位——最高位丢弃,尾部补零
③除法:除2,右移一位——丢弃最低位,前部补零
11111111被当作纯二进制原码看待时,就是255;被当作补码看待时就是-1(因为11111111+1=100000000=0)
补码表示的范围负数部分总比正数多1。
(4)整型数据的表示范围:
①位长(0和1的个数):4/8/16/32/64(种数:2^4 、 2^8 ……)
②有符号否(以四位为例):
a)无符号数(int):全部位数都用来表示数值。范围0000-1111(0-15)
b)有符号数(unsigned int):最高位表示符号(0-正;1-负),剩下的才表示数字大小。范围1000-0111(-8~7)
上面两中表示方法,都有16个数——16种(2^4)
③默认int类型:
a)不属于C++标准
b)原则:char <= short int(=short) <= int <= long int <= long long int(区别在于所占字节的多少)
④整数字面值(有别于“字符型\”)
a)用具体数值表示的数值,可以直接看出其值的大小;
b)三种表示方法
i.十进制:常见的认知中的自然数;
ii.十六进制:0x或0X开头的数(4位)。
iii.八进制:0开头的数字(3位)。
注意转化为十进制时的计算方法!
c)后缀:
i.要区分是有符号还是没符号:无符号就是在数字末尾加上U或者u;
ii.长整型:在数字后面加上L或者l(小写的L);
2. 整数子类
(1)字符型 char:
①字符在计算机内部保存为ASCII值,就是字符和整数之间的关系,共有128个,范围是0-127.(注意在输出的时候占位符是“%c”)
②分类
a). 可见cont(就是上表的32-126)。
1.其保存方法:用相应的数字代码或者用单引号直接写需要的字符。
比如,要在char c里面保存大写的字母A,可以是“c=65”;,也可以是“c=‘A’”;
要记住0-9、a-z、A-Z对应的ASCII码值。
2.转义字符法:
ⅰ.\ddd(d=0~7):ddd为8进制数
ⅱ.\xhh(h=0-9以及A-G):hh为16进制数
b). 不可见cont(0-31,127)
常见 - 转义字符:
\a: 相当于\007; 相当于\x07;代表响铃
\b: 相当于\010;相当于\x08;代表光标(下一个将要输出的位置)退格
\t: 相当于\x09;从当前光标移动到下一个制表符位置(8的倍数+1列)
\n: 相当于\x09;表示回车并换行(是下一行的第一列)
\v:相当于\x0B;表示垂直制表符(在打印机上才实现)
\r:相当于\x0D;只表示回车(回到当前行首并覆盖)
\’: 相当于\x27;相当于\047;输出语句中打印’
\\:相当于\x09;输出语句中打印\
\?: 相当于\x3f;在表示字符是需要转义;但是在字符串中,可以不转义。
(2)实型常量
①小数形式:123.456
②指数形式:12.34e3(表示12.34乘10的三次方;用e/E来表示指数次方)
指数形式的格式要求与常规数学上的要求是一致的,只不过用e来表示“次方”。
(3)字符串常量:“boy”、“123”
(4)符号常量
#define PI 3.1416(经编译后,一旦在代码内出现PI,就相当于3.1416)
【行末一定是没有分号的】=const double PI=3.1416;【有分号】
注意:
1.从常量的形式可以判定其类型,所以没有特别标明int、double...;
2.不带小数点的是整形常量,但应注意其有效范围;
3.C编译系统把浮点型常量都按双精度处理,分配8个字节。
二、变量(存储单元)
1. 基本原理:计算机内部有很多bit(总共统计为G),如果你的电脑是64位,每8个字节(64个位)就可以储存一个固有类型的变量。所以如果我定义了变量但并不改变它的值(初始化),打印时,就会显示电脑内部原有的值(8个位)【没有规律的数字】;
2. 标识符:只能由字母、数字和下划线三种字符组成;并且第一个字符不能是数字;还要避开关键字:
3. 数据类型(长度和存储形式):
4.整形数据:
①只有整形(包括字符型)数据才可以加signed和unsigned修饰符,实型数据不能加。
②对无符号整形数据用“%u”格式输出(表示无符号十进制数格式)。
③在将一个变量定义为无符号数据之后,就不应该将它再赋予一个负值,否则会得到错误的结果。
5.字符变量
以数字1和字符‘1’为例来理解:
(1)字符‘1’只是代表一个形状为‘1’的符号,在需要时按原样输出,在内存中以ASCII码形式存储,占一个字节【00110001(二进制)】;
(2)数字1是以整数存储方式(int)存储的,占2或4个字节【0000000000000001】
(3)区别:整数运算1+1=2;而字符运算‘1’+‘1’=49+49=98.
6.浮点型数据
(1)举例:3.14159=3.14159*100=31.4159*101=314.159*102
(2)由于小数点的位置可以浮动,所以实数的指数形式称为浮点数;
(3)类型:float、double、long double
理解:由于二进制形式表示一个实数以及存储单元的长度是有限的,因此不可能得到完全精确的值,只能存储成有限的精确度。小数部分占有的bit数越多,数的有效数字越多,精度也就越高。指数部分占的位数越多,则能表示的数值范围越大。
7.实型数据: 也称为浮点数或实数。在C语言中,实数只采用十进制。它有二种形式:十进制小数形式和指数形式。
注意:实型常数不分单、双精度,都按双精度double型处理。
补充:常量、变量和类型:
1.语句:float a=3.14159; //3.14159为双精度浮点常量,分配8个字节;a为float变量,分配4个字节。
2. 上述语句在执行时可能会发出警告(warning),告知强制执行会损失精度。一般不会影响结果的正确性,但是会影响结果的准确性。
3. 可以在常量的末尾加专用字符,强制置顶常量的类型:float a=3.14159f; //将3.14159作为单精度浮点常量处理,这样处理就不会发出警告。
4. 类型是变量的一个重要属性,只能用来声明,不能用来接收具体的值(需要变量名)。
三、翁恺老师的形象解释
1. 在计算机内存储的二进制数是一样的,为什么输出的结果会不一样?原因就在于,定义的变量类型,不同类型所占字节数量不同。
2. 整数的范围:右边(最小值)总比左边(最大值)少1,这是为什么?——中间还有0啊,同时,按照二进制的计算规则,刚好。
3. 强调一下“unsigned”:
①如果有char类变量变成unsigned了,就无法再表示负数,但是其正整数的表达范围就比原来多一倍。
但是其初衷并不是为了扩大整数范围,而是为了做二进制运算,让最高位的1 不起作用,主要是为了移位。
②如果是char类型(最高位表示符号),其最大值是127,最小值是-128。如果在char a=127的前提下加1,就会变成a= -128,就像是一个圆圈,转回去。(-128)-1的话又会变成127.
4. 但如果更改成了unsigned类型,就是0-1=255;255+1=0.
写在最后:
更新C语言学习笔记
如有错误,烦请多多批评指正!