People Lack Willpower,Rather Than Strength!
1.原/反/补码!
-
数据在计算机内部是以补码的形式储存的
- 对于正数:反码====补码====原码。
- 对于负数:反码==除符号位以外的各位取反。补码=反码+1
-
为毛引入原码\反码\补码?
- 首先, 因为人脑可以知道第一位是符号位, 在计算的时候我们会根据符号位, 选择对真值区域的 加减. (真值的概念在本文最开头). 但是对于计算机, 加减乘数已经是最基础的运算, 要设计的 尽量简单. 计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂! 于是人们想出了
将符号位也参与运算
的方法. 我们知道, 根据运算法则减去一个正数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有减法, 这样计算机运算的设计就更简单了.
- 用反码计算减法, 结果的真值部分是正确的. 而唯一的问题其实就出现在"0"这个特殊的数值 上. 虽然人们理解上+0和-0是一样的, 但是0带符号是没有任何意义的. 而且会有[0000 0000]原和 [1000 0000]原两个编码表示0.
- 首先, 因为人脑可以知道第一位是符号位, 在计算的时候我们会根据符号位, 选择对真值区域的 加减. (真值的概念在本文最开头). 但是对于计算机, 加减乘数已经是最基础的运算, 要设计的 尽量简单. 计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂! 于是人们想出了
-
为什么8位二进制位取值范围是:-128~127? 注意:这个范围是补码!不是原码!
因为0用[0000 0000]表示, 而以前出现问题的
-0
则不存在了,所以[1000 0000]可以表示一个数字! 表示-128: (-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补
2.位运算
-
按位与
&
----一假则假!- 应用场景:
- 按位与运算通常用来对
某些位清0或保留某些位
。例如把a的高位都清0,保留低八位,那么就a&255 - 判断
奇偶
: 将变量a与1做位与运算,若结果是1,则 a是奇数;若结果是0,则 a是偶数 - 任何数和1进行&操作,得到这个数的
最低位
- 按位与运算通常用来对
- 应用场景:
-
按位或
|
----一真则真 -
按位异或
^
-----不同则为真1
-
取反
~
3.位移
- 1.左移位运算符
- 把整数a的各二进位全部左移n位,高位丢弃,低位补0。可能改变正负性!
- 2.右移位运算符
- 把整数a的各二进位全部右移n位,保持符号位不变,最高位补0还是1取决于编译系统!我们取
1
- 把整数a的各二进位全部右移n位,保持符号位不变,最高位补0还是1取决于编译系统!我们取
4.内存分析
-
内存以“字节为单位”
-
任何变量在内存中都是以二进制的形式存储。一个负数的二进制形式,其实就是对它的正数的二进制形式进行取反后再+1。👌就是说负数的补码==其正数取反再加1
- (负数)1000 0001[原码]->二进制存储形式(补码) 1111 1111
- (正数)0000 0001[原码]-> 取反 1111 1110 ->+1后 1111 1111
5.char类型
-
1个字符型变量占用1个字节,共8位,因此取值范围是-27~27-1(有一位作为符号位,真值只占7位)。在这个范围内,你完全可以将
字符型变量当做整型变量
来使用 -
小写字母比大写字母大32!
6.修饰符(说明符)
- signed :正负数和0; unsigned:正数和0.
7.数组
-
数组概念
- 数组:一组具有
相同
数据类型的数据的有序的集合 - 数组元素:构成数组的数据。数组中的每一个数组元素具有
相同的名称
,不同的下标,可以作为单个变量使用,所以也称为下标变量。 - 数组的下标:是数组元素的位置的一个索引或指示。(从0开始)
- 数组的维数:数组元素下标的个数。根据数组的维数可以将数组分为一维、二维、三维、多维 数组
- 数组:一组具有
-
数组初始化
- 部分元素初始化,其他元素都被赋值0
- 没有初始化,数组中是有值的,是随机的垃圾数
- 先定义,后初始化,只能对逐个下表变量初始化!
- 在定义数组的时候[]里面只能写整型常量或者是整型常量的表达式!
- 也就是说: array[97] \ array['A'] \ array['a'-32] 都OK!!
- 而int num = 97 ; array[num] \ array[myReturn()] NG!!
int myReturn(){ return 97;}
-
数组的长度 = 数组占用的总字节数 / 数组元素占用的字节数 == sizeof(arrayname)/sizeof(array[0])
-
数组作为函数形式参数时,会改变外面的值,因为数组本质上是指针!
网友评论