操作符
进制转换
2进制转10进制
| 2进制的位 | 1 | 1 | 0 | 1 |
|---|---|---|---|---|
| 权重 | 2^3 | 2^2 | 2^1 | 2^0 |
| 权重值 | 8 | 4 | 2 | 1 |
十进制:1×8+1×4+0×2 +1×1=13
所以1101的十进制就是13
10进制转2进制

第一个求得的1在最后一个位权
2进制转8进制
八进制的数字为0~7
二进制转八进制时,从右往左每3个二进制位换算一个8进制位,剩余的数不够3时则直接换算
比如01 101 011换成8进制就是0153
0开头的数字会被当成8进制位

2进制转16进制
16进制的数字有09、af
**方法一:*二进制转十六进制时,从二进制右边向左每四个2进制位换算一个16进制位,不够4个则直接换算
2进制的0110 1011换成16进制就是0x6b
表示16进制时前面加0x

**方法二:**从右向左,每四位二进制数看成一个16进制数,最左边不够四位的话则补0

16进制转2进制
与2进制转16进制相似,也是运用8421法,只不过是要反转过来
求:36A的2进制

10进制转2进制 / 10进制转8进制 / 10进制转16进制
如果是转二进制,则将10进制的数除与2,把余的部分拿出来

转8进制和转16进制的部分同理
原码、反码、补码
整数的二进制有三种表示方法,分别是原码、反码、补码
有符号整数的三种表示方法均有符号位和数值位两部分,2进制序列中,最后高位的第一位被当作符号位,剩余的都是数值位("0"表示正,“1”表示负)
对于无符号整数,所有的都是数值位,表示>=0
正整数的原码、反码、补码相同
对于负整数:
这里我们举个例子,例如int a=-10
**原码:**直接将数值按照正负数的形式翻译成二进制得到的就是原码
1000 0000 0000 0000 0000 0000 0000 1010 (为什么是32位数呢,因为int是整形,占四个字节,而一个字节等于8个比特位bit,所以是个32位的数)
**反码:**原码的符号位不动,其他位依次按位取反就是反码
1111 1111 1111 1111 1111 1111 1111 0101
**补码:**反码+1就得到补码
1111 1111 1111 1111 1111 1111 1111 0110

对于整形来说,数据存放内存中其实存放的是二进制的补码
原因是可以将符号位和数值位统一处理,加法和减法也可以统一处理
移位操作符
作用;移动存储在内存中的二进制位(补码)
作用对象:只能是整数
左移操作符:<<
右移操作符:>>
左移操作符
int main()
{
int num=10;
int n=num<<1;
printf("n=%d",n);
return 0;
}
输出结果为 n=20
左移一位有×2的效果

右移操作符
右移分为逻辑右移和算术右移
逻辑右移:左边用0补充,右边丢弃
算术右移:左边用原该值的符号位填充,右边丢弃
位操作符
注意:以下按位操作符的操作数必须是整数
&按位与
规则:对应的二进制位,只要有0即为0,两个同时为1才为1
|按位或
规则:对应的二进制位,只要有1就为1

^按位异或
规则:对应的二进制位,相同为0,相异为1
~按位取反
规则:按二进制位取反
运用
1.不创建临时变量,如何实现两个整数的交换
int main()
{
int a=3;
int b=5;
int c=0;//作为临时变量储存中间数
printf("交换前:a=%d b=%d",a,b);
c=a;
a=b;
b=c;
printf("交换前:a=%d b=%d",a,b);
}
以上这种方法也能实现整数的交换,但是不满足题干的要求,因为创建了临时变量
所以我们可以来考虑用异或操作符来进行计算

异或是支持交换律的
0^a=a
a^a=0
单目操作符
! ++ – & * + - ~ sizeof
这里着重介绍&和*,在后面的指针学习中会比较重要
&——取地址操作符
这里要注意区分和按位与&的区别:&a是取地址,a&b是按位与
*——解引用操作符
逗号表达式
用逗号隔开的多个表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果

下标访问[]、函数调用()
[]下标引用操作符
int arr[10];//创建数组
arr[9]=10;//[ ]的两个操作数是arr和9
函数调用操作符
()就是函数调用操作符
int a=add(3,5);//操作数是add、3、5
函数调用操作符至少有一个操作数,就是函数名
结构成员访问操作符
结构是一些值的集合,数组也是值的集合,但和数组不同的是,结构的成员可以是不同类型的,如标量、数组、指针
结构体
C语言中,有很多内置类型比如int、float、char诸如此类,但有时候如果我们想买描述的对象有多个特征,这些类型就会不够,因此C语言新增结构体这种数据类型,让用户可以自行创建合适的数据类型
//学生类型
struct Student//struct是创建结构体的关键字
{
//成员变量
char name[20];
int age;
float score;
}s4,s5,s6;//全局变量
//注意这里要加分号
struct Student s3={"光头强",20,99.0};//全局变量
int main()
{
int a;
struct Student s1={"熊大",18,99.0};//成员对象s1(局部变量)
struct Student s2={"熊二",17,90.0};//成员对象s2
}
结构体成员访问操作符
直接访问
直接通过点操作符(.)进行访问,有两个操作数
结构体变量.结构体成员名

操作符的属性
优先级、结合性
关于操作符的优先级,这里给出了一个参考链接,做出了申明
[C 运算符优先级 - cppreference.com]()
表达式求值
整型提升
在C语言中,算术运算总是以整型类型的精度来进行的,因此为了获得这个精度,表达式中的字符(char)和短整数操作型(short)在操作之前会被转化为普通整型,这种转换称为整型提升,这一步往往是由CPU去执行的
算术转换
操作符的各个操作数属于不同的类型,这时就要将其中一个操作数的类型转换为另一个操作数的类型,这样操作才可以继续进行
算术讨论的是类型大于整型的类型的类型

int a;
double d;
a+d;
在这段代码中,要将int类型转换为double类型
获得这个精度,表达式中的字符(char)和短整数操作型(short)在操作之前会被转化为普通整型,这种转换称为整型提升,这一步往往是由CPU去执行的
算术转换
操作符的各个操作数属于不同的类型,这时就要将其中一个操作数的类型转换为另一个操作数的类型,这样操作才可以继续进行
算术讨论的是类型大于整型的类型的类型
[外链图片转存中…(img-tuDuAK4X-1727772197718)]
int a;
double d;
a+d;
在这段代码中,要将int类型转换为double类型
&spm=1001.2101.3001.5002&articleId=142672212&d=1&t=3&u=cf3f28518eb24701bc9acd8acd958916)
2万+

被折叠的 条评论
为什么被折叠?



