**补充整形数据在内存中的存储
在计算机中,整形数据被存储在内存中的连续的字节区域中。整型变量的大小取决于它的数据类型。通常,整型数据类型的大小可以是1个字节、2个字节、4个字节或8个字节。在内存中存储整型数据时,使用的是二进制表示法。例如,一个8位的二进制数可以表示0到255之间的整数值。
对于一个给定的整型变量,它在内存中的存储方式是按照字节顺序存储的。即整型变量中的最低字节存储在最低的地址处,最高字节存储在最高的地址处。这种方式称为小端存储方式。
例如,一个32位的整型变量0x12345678在小端存储方式下,它的存储顺序如下:
地址 存储值
0x1000 0x78
0x1001 0x56
0x1002 0x34
0x1003 0x12
在大端存储方式下,整型变量中的最高字节存储在最低的地址处,最低字节存储在最高的地址处。但实际上,大端存储方式在现代计算机中已经很少使用了。
整数在计算机中有三种2进制表示方法,原码 反码 补码
三种表示方法均有符号位和数值位两部份。符号位都是用0表示正,用1表示负
例如:
1和-1在32位系统中的表达
00000000 00000000 00000000 00000001 1
111111111 111111111 111111111 111111111 -1
整形数据在内存中的存储是以二进制的补码在内存中存储的。
补码得到的步骤:
正数的原码 反码 补码是一样的
对于负数:
原码-->按位取得到反码-->反码—+1=补码
目录
3.位操作符(操作二进制位,以二进制形式进行计算,操作数必须是整数)
1.算术操作符
+ - * / %
2.% 得到余数
1.除了%之外其他的操作符都可以作用于整数和浮点数
2.%操作的两个数必须为整数,返回的是整除后的余数
1.1 /
1.整数除法,除数两端都是整数
2.(小数)浮点数除法(除号两端只要有一个小数就执行浮点数除法)
3. 除数不可以为0;
2.移位操作符(移位操作符移动的只能是整数)
2.1<< 左移操作符
规则:左边抛弃,右边补0
1在内存中的存储
00000000 00000000 00000000 00000001
将其左移一位
00000000 00000000 00000000 00000010
2.2 >> 右移操作符
关于右移操作符
1.逻辑移位
逻辑右移:
右边丢弃,左边直接补充0.
2.算术移位。
比如算术的逻辑右移:右边丢弃,左边补充原来的符号
注意:
C语言没有明确规定是算术右移还是逻辑右移,一般编译器采用的是算术右移。
这里的 00000000 00000000 00000000 00000111 因为是正数,原码 反码 补码都一样就直接计算打印结果。如果是负数还需要转化为原码才可以计算出正确结果。
注意:
对于移位运算符,不要移动负数位,对于C语言来说是标准未定义行为
3.位操作符(操作二进制位,以二进制形式进行计算,操作数必须是整数)
3.1 & 按位与
按位与规则:对应二进制位上两个数只要有0就为0,两个全为1才是1。
附上源码大家体验一下:
int main()
{
int a = 3;
//正数,原码 补码 反码相同
//00000000 00000000 00000000 00000011
int b = -5;
//原码: 10000000 00000000 00000000 00000101
//原码符号位不变按位取反得到反码:11111111 11111111 11111111 11111010 ——反码 反码+1得要补码
// 111111111 111111111 11111111 11111111 11111011 -5在内存中的补码
int c = a & b;
//两个补码按位取反
// 3- 00000000 00000000 00000000 00000011
// -5- 11111111 11111111 11111111 11111011,规则,对应二进制位有0就都是0,都是1才是1
//得到结果 00000000 00000000 00000000 00000011 这就是两个数按位取反得到的结果补码,
//看符号位是正数,算出结果为3
printf("%d\n", c);
return 0;
3.2 | 按位或(操作对象二进制整数)
规则对应二进制位有1就为1,两个同时为0才是0.
沿用上例:
3.3 ^ 按位异或 (操作对象为二进制整数)
规则: 对应的二进制位相同为0,相异为1.
沿用上例:
4.赋值操作符 =
int weight = 120;
可以连续赋值
a = x = y+1;
x = y+1;
a = x;
复合赋值符:
+= x+= 10 x = x+10;
-=
*=
/=
%=
>>=
&=
5.单目操作符(只有一个操作数)
5.1 ! 逻辑反操作符
将真变成假,假变成真
一般和if语句中判断条件处使用
if(i != 0)
5.2 sizeof(操作数的类型长度(以字节为单位))
1.sizeof计算的是类型,比如(sizeof(int))、创建变量的大小,单位是字节
2.sizeof是操作符不是函数
3.sizeof在计算创建的变量时可以不用加括号,这样证明了其不是函数。
看演示
5.3 前置++、--,后置++、--
前置++、--都是先使用变量的值过后在进行自加自减
后置++、--是先进行++、
5.4 其他单目操作符
- 负值
+ 正值
& 取地址
~ 对一个数的二进制位按位取反
6.关系操作符
>
>=
<=
!=
==
7.逻辑操作符
&& 逻辑与 并且
|| 逻辑或 或者
8.条件操作符
exp1?exxp2:exp3
用法:
判断exp1为真,就执行exp2,不管exp3
判断exp1为假,执行3,不管2
附上源码大家体验效果
int main()
{
int a = 0;
scanf("%d", &a);
int b = 0;
/*if (a > 5)
{
b = 3;
}
else
{
b = -3;
}*/
//这段代码可以等值替换为条件操作符
(a > 5)?( b = 3) :( b = -1);
printf("%d", b);
return 0;
}
9.逗号表达式
exp1,exp2,exp3,.......expn
逗号表达式,就是用逗号隔开的多个表达式
逗号表达式,从左向右依次执行,整个逗号表达式的结果就是最后一个表达式的结果
10.下标引用、函数调用和结构成员
10.1 数组的下标引用操作符
不知道大家和我有没有一样的疑问:
在创建数组时,例如数组是10个元素:
int arr[10] = {0};
但是我们在使用数组的时候数组的下标只能最大到9.
原因:
int arr[10] //这是创建数组的形式
arr[9] = 10;这里的【】是下标引用操作符
10.2函数调用操作符 ()
接收一个或者多个操作数:
第一个操作数是函数名
剩余的操作数是函数的参数
(比如scanf函数的参数就是自增长类型,用户输入多少个就是多少个参数)
最低是一个操作数,因为函数可以没有参数。
以上就是C语言操作符的总结,大家可以重点看一下展开讲解的内容,没有展开讲解的内容就去了解用法就OK。欢迎大家指正。