操作符分类
二进制和进制转换
十进制其中每个数在0到九中 ,其他进制同理,如二进制数只能为0到1 ,而对于16进制 中超过十的数用abcdefg表示 a表示10,同理往后 。
而对于c语言中二进制 八进制 十六进制的表示 则有以下链接
而对于之前的转义字符/ddd和/xdd是这两个单纯表示字符 并不是代码中进制的表现形式 真正的进制表现形式在上述链接中 二进制前面必须带0b或0B ,八进制前面带0,十六进制前面带0x或0X,十进制不需加任何后缀 %d打印出十进制整数 %o打印八进制整数 %x打印十六进制整数
对于进制间的转换, 计算机常用进制为八进制 十六进制 十进制 二进制 ,所以一般只要考虑这几种进制转换 ,常用的进制转换为以下几种:
1.其他进制转换为十进制 如二进制
其他进制也一样
2.十进制转换为二进制
用以下方法可以得出二进制 对于本质不用理解 就这么用
也就是除的数余数如果为1则在二进制表示相应位数就为1 否则为0 之后该方法会是求内存中含有几个1中的方法之一 之后会讲到
当数较多时用该方法求 当数较少时就自己口算
3.八进制转换为2进制,十六进制转换为2进制 ,2进制转换为八进制,2进制转换为十六进制
反过来用八进制,十六进制也可以转换为二进制
如果自己不想算或者太复杂的话我们也可以用电脑计算机去转换 , 一样是可行的且更简便不用自己算 , 但是对于这几种转换方法我们还是要知道并且去用,不能太依赖机器 。
原码 ,反码,补码
整数的二进制表示方法有三种 原码 ,补码,反码 ,有符号整数(signed)三种表示方法均分为符号位 数值位 符号位用0表示正 1表示负
对于正整数原码补码反码都相同 而负数不同,其原码要经过数值位取反得到反码 再加一得到补码 (同理,补码得到原码经过取反,加一也可以得到)
对于整型来说 数据存放的是以补码形式存放。
移位操作符
移位操作符的操作对象只能是整数 分为<<和>>
<<(左移操作符)展示
>>(右移操作符)展示
分为两种 逻辑右移和操作右移
两种右移选择取决于编译软件 但绝大部分编译软件选择算术右移 vs2022就选择算术右移,因为算术右移改变较为合理 会看其正负数 , 而逻辑右移比较粗暴 完全不看正负数 依照逻辑直接粗暴执行
对于移位操作符右边操作数不能为负数 ,只能为正数
位操作符
& | ~ ^ 这四种 操作数必须为整数
按位与操作符是当两个补码中对应的为两个1时得到的对应数才能为1 否则为0(两个真才能为真)
按位或操作符是当两个补码中对应的为两个0时得到的对应数才能为0 否则为1(两个假才能为假)
按位异或操作符是当两个补码中对应的两个数如果相同则得到0 不同则为1
按位取反操作符是直接把补码所有位给取反
常用的公式: a^a=0,a^0=a, n&(n-1)执行完后可以把内存中n最右边的1给变为0
交换两者值的题目
对于交换值的方法 有三种
常用第一种, 但是不能创建第三变量时就用第二种和第三种 , 第二种会有缺点 ,第三种运用到了位操作符
对于^(按位异或操作符)有常用的 0^a=a , a^a=0 。其中若有三四个操作数用^运算 可以交换顺序算且并不影响结果。
求一个整数在内存中的1的个数
逗号表达式
多个表达式用逗号串起来再用括号放在一起这整个就是逗号表达式 从左到右依次执行,其结果为最后一个表达式的结果。(逗号表达式是逗号与括号结合在一起使用)
下标引用操作符和函数调用操作符
之前都学过且已经熟练应用 所以这里不必多讲
结构成员访问操作符
首先要了解结构成员访问操作符我们必须先了解数据类型中的结构体,其属于自定义类型
结构体的创建 以及用其创建变量 如下
下方该图为创建结构体部分 ,同时s3 ,s4为全局变量 ,可以创建也可以不创建 ,但分号不可失。
下方该图就是用创建好的数据类型创建局部变量
对其变量进行初始化
其结构体内嵌套结构体
结构成员访问操作符
分为两种 一种是直接访问操作符 为点操作符
另一种为间接访问操作符
有点超纲对目前的我来说,还没学过指针。
之后对于结构体会更加详细的进行讲述,讲述更多细节,目前只要了解一下就行。
操作符的优先级和结合性
不需要特别了解它 ,只要知道操作符有这个东西就行 (比如连续赋值之所以从右往左执行就是因为=操作符结合性从右到左)
问题表达式
即使你十分熟练的知道优先级和结合性的使用 但当表达式非常的复杂时,就有时会出现问题,其中有多种路径去得到不同的结果,选择哪种路径取决于编译器。该表达式就被称为问题表达式,我们写表达式时不能写这种表达式,一般太复杂的话就拆开来写。
所以在编译器中写出的表达式不要过于复杂,否则可能会出现以上情况 。
整形提升与算术转换
整形提升
整形范围里的数进行计算,都会将其转化为int或者unsigned int类型进行计算 因为cpu进行计算的长度是int的字节长度 所以要转化成int类型才能计算
int就是signed int ,size_t默认是unsigned int形式, char在大部分编译器中默认为signed char 在vs中默认为signed char
对于写出的小数默认是double类型,所以如果要用float类型去创建变量且赋值 ,应在小数后方加个f,如3.14f。
有符号整数进行提升看其符号 若符号位为0,则前面全补为0.若符号位为1,则前面全补为1
将字符用十进制方式打印等同样要用到整型提升 例子如下
整型提升是将小字节长度转换为大字节长度,其填充的东西是有一定规则的
相反将int大的字节长度转化为char ,int小的字节长度时是直接截断的,截断时符号可能直接由正数变为负数 它是直接截断的非常粗暴 跟提升是不同的,提升有规则而它很粗暴
算术转换
对于超出整形类型的不同类型数进行计算时 会先转化成相同类型再进行计算 其跟整形提升不同 其在整形范围里 而这个超出整型范围
比如float 跟int 类型进行计算 依照其排名会把int给转换为float类型再进行计算
对于整形提升和算术转换,只是作为补充讲解,书中并没提到这种,我们了解清楚就ok。