这里写目录标题
基础知识
内存变量原理
掌握赋值内存和寄存器如何配合的
_asm{
Mov eax, num;
Add num, 15;
Mov num, eax;
}//寄存器操作
由于cc++变量只是定义之后没有做初始化,是垃圾数据,所以要求变量一开始必须先做初始化,而python/java等语言,定义之后会默认赋值为零。
进制
int num = 012;//0是八进制的表示 0x是十六进制
printf
printf不会对数据进行数据类型的转换
数据类型
- 二进制的位数不能无限使用,整数有一定的大小限制,只能在一定的范围之内。
- 内存可贵,珍惜使用
计算机补码表示
-7
原码:1000 0111
反码:1111 1000
补码:1111 1001 F9
为什么要用补码表示呢?
来源于导弹的应用,追求绝对的准确。
对于原码如果正数和负数相加,需要多步操作,而对于补码,一步操作即可。
比如:
0000 1001 +9 原码表示
1000 0010 -2 原码表示
二者相加,需要比较大小,去掉符号,相减,加上符号(四步)
0000 1001 +9 补码表示
1111 1110 -2 补码表示
00000111 +7
二者相加,一步操作即可
float浮点数的二进制存储和转换
float和double在存储方式上都是遵从IEEE的规范
符号位 指数 尾数
余127码 float 1 8 23
余1023码 double 1 11 52
尾数的精度决定了有效数字的精度
float类型是6-7位,因为十进制数字9需要用四位二进制数表示。
实数是带有小数部分和整数部分的数字,也就是我们通常说的小数。
对于小数点,计算机采用了两种表示方法:定点表示法和浮点表示法
1.什么是定点表示法及定点表示法的缺点?
定点表示法:分别使用定长来表示小数和整数部分,这样会存在一个问题。如果分配的小数部分位数较短,存储3.1415926这样的数值时精度太差;反之分配给小数部分的位数较长,那么能表示的整数部分数值范围太小。
2.什么是浮点表示法以及浮点表示法的优点?
浮点表示法:等同于科学计数法,极大增加了实数可存储的范围。
无论十进制还是二进制使用浮点表示法都是由三部分组成:符号 位移量 定点部分
用科学表示法(浮点表示法)表示十进制数字 +3145600000为+3.1456×10^9
符号部分:(+),位移量:9,定点部分:(3.1456)
同理,二进制数据10101100000000.00表示为 +1.01011×2^13
同理,二进制数据-(0.0000000001011)表示为 -1.011×2^(-10)
注意:小数点左边都只保留了一位的非零数码,小数点和定点部分左边的1并没有存储是隐含的。
符号部分采用一个二进制位来存储(0或1)
尾数是指小数点右边的二进制数,定义了该数的精度,尾数是作为无符号整数存储的。如果将符号一起考虑的话可以说是通过符号加绝对值存储的
指数是可正可负的,计算机中使用余码表示法来存储指数
3.什么是余码表示法?
为了让正的和负的整数都可以作为无符号数存储,计算机通常采用余码表示法。在余码系统中,使用一个正整数(称为一个偏移量)加到每个数字中,用于把它们统一移到非负的一边。这个偏移量的值是2^(n-1)-1,n是内存单元存储指数的大小。这种新的表示法与移位前的表示法相比,其优点在于余码系统中的所有整数都是正数,当我们在这些整数上进行比较或运算时不需要考虑符号。
在学习了十进制和二进制的转换之后,对于实数最容易想到的二进制表示方法应该是区分整数部分和小数部分。将一部分字节位给整数部分,整数部分留出最左边一位给符号位,另一部分字节位给小数部分。但是这样会造成空间的浪费,比如4字节 32bit存储空间,16位给整数,16位给小数,那么对于小数部分为0时,整数还是只能用有限的16位空间。
c语言为什么要提前声明变量
建立变量符号表
变量的数据类型指示系统分配多少内存空间
变量的数据类型指示了系统如何解释存储空间的值
变量的数据类型决定了该变量的取值范围
不同的数据类型有不同的操作
数据类型转换
自动数据类型转换与强制类型转换
操作符号
运算符不能相邻,但是±符号除外,因为±3实际是此处是分解为加负3
主要是四类:算数/逻辑/关系/位
赋值表达式
自增自减运算
条件运算符的结合方向
条件运算符的优先级仅大于赋值运算符
逻辑运算符
printf数据控制
scanf
scanf只能指定实数输入的宽度,无法指定输入的精度。输出是可以指定的
回车会被当做一个输入
%n统计字符数量
bool类型
C语言没有bool类型
左移移位预算,越界之后会截取高位,而不是低位
float浮点数相等判断
float 类型:占4个字节,7位有效数字
double型:占8个字节,15~16位有效数字
由于浮点数的表示是不精确的,所以不能直接比较两个数字是否相等。一般比较的两个数字的差值在允许的某个范围内则认为浮点数相等。比如,两个浮点数a、b, 允许的误差范围
1
e
−
6
1e^{-6}
1e−6, 即
a
b
s
(
a
−
b
)
<
=
1
e
−
6
abs(a-b)<=1e^{-6}
abs(a−b)<=1e−6, 则可以认为a和b相等。
float型变量和“零值”比较方法:
#include <stdio.h>
int main(int argc, char *argv[])
{
float x = 0.000f;
const float EPSINON = 0.000001;
if (( x >= -EPSINON ) && ( x <= EPSINON ))
{
printf("x 是零\n");
}
return 0;
}