目录
三目运算符
逗号运算符
自增自减运算符
位运算
运算符优先级
补码讲解
整型解析
溢出解析
浮点数IEEE754标准解析
浮点数精度丢失
真题
汇编指令
生成汇编方法
常用指令
三目运算符
条件运算符是C语言中唯一的三目运算符。通过判断问号之前的表达式的真假,来确定整体表达式的值。
result=(condition)?a:b;
condition为true时,result=a;为false时,result=b。
条件运算符高于赋值运算符。
逗号运算符
逗号运算符的优先级最低。逗号表达式的整体值是最后一个表达式的值。
eg:if(i,j-1)//并不会进入if内,逗号表达式整体的值是(j-1)。
自增自减运算符
其它运算符除了赋值运算符外都不可以改变变量本身的值。而自增自减保留自B语言的习惯。
++i;先加再使用i。
i--;先使用i,再减。
j=*p++;等价于j=*p;p++;
j=p[0]++;等价于j=p[0];p[0]++;
位运算
左移:<<。高位丢弃,低位补0,相当于乘以2。
右移:>>。低位丢弃,正数高位补0,负数高位补1,相当于除以2。位移比乘法和除法的效率更高,对于负偶数右移是除以2,但对于负奇数右移是先减1再除以2。eg:-7>>1得到-4。-1无论右移多少位,值永远是-1。
C语言的左移和右移相当于算术左移和算术右移。考研中的逻辑左移和右移都是再空位都补0。
按位取反:~。数位上的1变成0,0变成1。
按位或:|。用两个数的每一位进行或,有1为1。
按位与:&。用两个数的每一位进行与,有0则0。
按位异或:^。同0异1。相同的数进行异或时,结果是0,任何数和0异或的结果是其本身。
位运算符只能对整型数据进行操作,位运算自身不会改变。
运算符优先级
补码讲解
计算机的CPU实际上是无法做减法操作的(硬件上没有减法器),只能做加法。
原码即值本身。
补码=原码按位取反后+1。用正数的补码表示负数。负数的原码就是正数的原码。
原码=补码-1后按位取反。先取反后+1也可以。
x86架构是小端存储,小端存储时低字节在前,即低字节再低地址。大端相反。是单字节颠倒,即8bit。
而在考研中,补码的符号位不变,即原码取反时最高位不变。正数的补码和原码一致。
反码:正数的反码和原码一样。负数的反码就是在原码的基础上,符号位不变,其它位不变。
整型解析
无符号数存储:2^n-1
有符号数存储:2^(n-1)-1
最小负数:1000 0000 0000 0000 -32768 补码。原码是本身。
溢出解析
#include <stdio.h>//整型不同类型的演示,以及溢出演示
int main() {int i = 10;short a = 32767;short b = 0;long c;//32位的程序是4个字节,64位的是8个字节b = a + 1;//发生了溢出,解决溢出的办法是用更大的空间i来存printf("%d\n", b);//b并不是32768,而是-32768printf("------------\n");unsigned int m = 3;unsigned short n = 0x8056;//无符号类型,最高位不认为是符号位unsigned long k = 5;b = 0x8056;printf("b=%d\n", b);//b是有符号类型,所以输出是负值printf("n=%u\n", n);//无符号类型要用%u,用%d是不规范的return 0;return 0;
}
浮点数IEEE754标准解析
浮点数精度丢失
真题
汇编指令
生成汇编方法
在环境变量中配置Path:G:\mingw64\bin
执行程序后,在终端中输入指令即可生成汇编文件。
gcc -S -fverbose-asm main.c