************************************************正文开始***********************************************
1、算数操作符
算术操作符:+、-、*、/、%
1.除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数;
2.对于 / 操作符如果两个数都为整数,执行整数除法,而只要有浮点数执行的就是整数除法;
3.% 操作符的两个操作数必须为整数,返回的是整除之后的余数。
我们看看代码来对这三点加深印象:
我们先来看 / 和 % :
#include <stdio.h> int main() { // / 除法 - 得到的是商 // % 取模(取余)- 得到的是余数 printf("%d\n", 10/2.0); printf("%lf\n", 10/3.0); printf("%d\n", 10/2.0); printf("%d\n", 10%2); return 0; }
效果展示:
第三行打印怎么不是 5 呢,我们来分析一下:
因此应该使用 %lf 打印。
我们对代码进行改正:
#include <stdio.h> int main() { // / 除法 - 得到的是商 // % 取模(取余)- 得到的是余数 printf("%d\n", 10/2); printf("%lf\n", 10/3.0); printf("%lf\n", 10/2.0); printf("%d\n", 10%2); return 0; }
效果展示:
这个例子就是验证了第二条:对于 / 操作符如果两个数都为整数,执行整数除法,而只要有浮点数执行的就是整数除法。
我们再来看看 % :
这里就印证了第三条:% 操作符的两个操作数必须为整数,返回的是整除之后的余数。
2、移位操作符
<< 左移操作符
>> 右移操作符
注:移位操作符的操作数只能是整数。移动的是二进制的位。
10进制的数据中:都是0~9的数字组成的;
8进制的数据中:都是0~7的数字组成的;
2进制的数据中:都是0~1的数字组成的。
10进制的数字都有自己的权重,比如 123:
2进制的数字也是一样有自己的权重,比如 1010:
8进制的数字也是一样,比如 12:
16进制(范围:0~15)的每一位:0 1 2 3 4 5 6 7 8 9 A B C D E F
因此,16进制表示10就是 A。
2.1 原码、反码、补码
整数:
整数的二进制表示形式有 3 种方式:原码、反码、补码
原码:把一个数按照正负直接翻译成二进制就是原码。
反码:符号位不变,其他位按位取反。
补码:反码 +1。
注:正整数的原码反码补码是相同的。(正整数写出原码就是反码和补码。负整数的原反补码需要根据以上规律计算)
举例:写出 5,-5的原码、反码、补码
5,-5是整数,整数是存放在整型变量中的,一个整型变量是 4 个字节 -- 32个比特位。
我们以 32 位来描述 5,5 用二进制表示为 101(这已经是3个比特位了),高位我们用 0 来补齐。因此5的二进制表示为:
00000000 00000000 00000000 00000101
注:第一个 0 表示的是最高位,最高位是符号位,正数的符号位表示为 0,负数的符号位表示为 1。
因为 -5 的二进制表示为:
10000000 00000000 00000000 00000101
5的原、反、补码:
00000000 00000000 00000000 00000101
-5的原、反、补码:
原码:10000000 00000000 00000000 00000101
反码:11111111 11111111 11111111 11111010
补码:11111111 11111111 11111111 11111011
整数在内存中存储的是补码二进制。
我们验证一下:
#include <stdio.h> int main() { int a = -5; printf("%d\n", a); return 0; }
内存中的 -5 存储展示:
我们来分析一下为什么是这样
内存中是以十六进制存储的,f 代表了 15。
编译器中是反着存的,所以是 fb ff ff ff 。这就验证了,二进制在内存中存的是补码。