C 语言数据类型在各个系统中所占的字节数
布尔代数(类似于集合操作)
示例:![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7f52188d88f70236aacd65b35d940ba0.png#pic_center)
C 语言中的逻辑操作
- 0 当作 False, 任何非 0 的数都是 True
示例(对比上图):
移位操作
左移:x << y
- 将 x 向左移动 y 个位置
- 算数左移和逻辑左移都是向右补 0
右移:x >> y
- x 向右移动 y 个位置
- 逻辑右移:在左边补 0
- 算数右移:在左边补最高的那一位
当移位数(< 0)或者大于所定义类型的位数(以 8 位为例)
- 如果移动的位数大于 8 ,比如 x << 9,则实际位移量为(8%9) == 1
- 如果移动的位数小于 0 ,比如 -1, 则实际的位移量为 8 -|-1| == 7
无符号整型与有符号整型
看上图,其中无符号整型的最大值为 65535 ,最小值为 0,它是一个永远大于0的数。
因此,如果你在 C 语言中做出了以下声明
unsigned short a = -1
那么它会转换成上图 -1 所对应的16进制 FF FF,也就是 65535
因此,下面的代码:
unsigned short a;
for(a = 10; a >=0; a--)
print("hello");
会是一个死循环,因为 a 永远不可能小于 0,当它为 0 时,再减 1 就会变成 65535
还有下面的代码:
unsigned short a;
for(a = 10; a - sizeof(char) >=0; a--) // sizeof(char) 等于 1
print("hello");
这会得出什么?
还是个死循环!因为 sizeof(char)
得到的size_int
类型的值, 而它是一个unsigend long
类型,unsigned
类型不会小于 0
接下来你可能就会理解下图了:
位扩充
- 在左边补最高位的值
位压缩
- 丢弃高位