//---------------------------原码,反码,补码 数据在计算机中的存储方法: 数据在计算机内部是以补码的形式储存的 数据分为有符号数和无符号数 无符号数都为正数,由十进制直接转换到二进制直接存储(其实也是该十进制的补码)即可。 有符号数用在计算机内部是以补码的形式储存的。 ( 正数的最高位是符号位0,负数的最高位是 符号位1。 对于正数:反码==补码==原码。 对于负数:反码==除符号位以外的各位取反。补码=反码+1) 以二进制的补码存储 正数:三码合一 负数:反码 = 源码取反,补码 = 反码+1, 或者 补码 = 源码取反 + 1, 前提都是符号位不变 正数的首位地址为0,其原码是由十进制数转换到的二进制数字 负数的首位地址为1,其原码后面的位也为10进制数转换过去的二进制数字,都是用补码方式表示 有符号数的。 1)原码 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 一个数的绝对值的二进制表示 正数:最高位改0 负数:最高位改1 2)反码 反码的表示方法是: 正数的反码是其本身 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反. 3)补码 补码的表示方法是: 正数的补码就是其本身 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1) 总结 正数三码合一: 负数: 原码负号位不变,其余个位取反 补码: 原码符号位不变,其余各位取饭+1,反码+1 //------------------------------------------------------------------------ 1+(-1) = 0 00000000 00000000 00000000 00000001 1 源码 00000000 00000000 00000000 00000001 1 反码 00000000 00000000 00000000 00000001 1 补码
10000000 00000000000000000000000001 -1源码 11111111 11111111 11111111 11111110 -1反码 11111111 11111111 11111111 11111111 - 1补码 00000000 00000000 00000000 00000001 1的补码 11111111 11111111 11111111 11111111 + -1的补码 ---------------------------------------------------------------------------- 00000000 00000000 00000000 00000000 0 1(源码) + (-1)(源码) = -2 1(反码) + (-1)(反码) = -0 1(补码) + (-1)(补码) = 0 //-----------------------位运算 位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制位的问题。 C语言提供了6个位操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的 char,short,int与long类型。 1)& 按位与 口诀: 同1为1,有0为0 只有对应的两个二进位均为1时,结果位才为1,否则为0 2) | 按位或 口诀:有1则1 只要对应的二个二进位有一个为1时,结果位就为1,否则为0 3) ^ 按位异或 口诀:同0非1 当对应的二进位相异(不相同)时,结果为1,否则为0 4)~ 取反 各二进位进行取反(0变1,1变0) 以上都是在二进制进行运算 1)<< 左移 1、各二进位全部左移n位,高位丢弃,低位补0 1)左移可能会改变一个数的正负性 2)左移1位相当于*2^n 举例:快速计算一个数乘以2的n次方 (8<<3 等同于8*2^3) 2)>> 右移 各二进位全部右移n位,保持符号位不变 x >> n x的所有二进制位向右移动n位,移出的位删掉,移进的位补符号位 1、右移不会改变一个数的符号 2 右移 n 位就相当于/2^n 用途:快速计算一个数除以2的n次方 (8>>3 等同于8/2^3) 技巧: 1)任何数和1进行&操作,得到这个数的最低位 2)想把某一位置0,就让它某一位置与0进行&运算 理解: 1)编程实现10进制转2进制 // 每次取 一个数的最后一个二进制位 >>(31-i) // 任何一个数和1进行&(按位与)得到任何一个数的二进制的最后一位 第一次取出符号位
a&1 --> 1 奇数 --> 0 偶数 1)数学方法: a = b - a; b = b - a; a = b + a; 2) int temp = 0,a = 1,b = -1; temp = a; a = b; b = temp; 3)实现两个变量值交换 a = a^b; b = a^b; --> a^b^b; --> a a = a^b;--> a^b^a; --> b 1001 a ^ 1101 b ---------------------- 0100 ^ 1101 b ----------------------- 1001 //----------------变量地址获取及存储原理 %p 输出一个地址 定义在函数中变量我们称为局部变量, 先分配字节地址大内存,然后分配字节地址小的内存 变量的首地址,是变量所占存储空间字节地址最小的那个地址 低位保存在低地址字节上,高位保存在高地址字节上 ---------------------------------------------- 华丽分割线 --------------------------------------------- 持续更新 敬请期待
|