二进制数的三种形式-----原反补
原反补的基本概念:
1、原码:一个十进制数字直接转化成的二进制序列
反码:将原码按位取反(无符号型)
补码:补码=反码+1
2、数据范围:
无符号数 (int 类型) 0~255
有符号数 (char类型) -128~127
1 (7个01组合) 0 (7个01组合)
0000 0000(+0) vs 1000 0000 (-0)
3、二进制序列:(数据在内存中以 补码 形式存储)
正数(二进制最高位0):原码=反码=补码
负数(二进制最高位1):原码----反码(符号位不变,其余数位按位取反) ----- 补码=反码+1
例如:
10 :0000 1010 (二进制) ----- 0x0A (十六进制)
20 :0001 0100 (二进制)----- 0x14 (十六进制)
-10:1000 1010 (二进制)----- 1111 0101 (反码)------
1111 0110(补码)----- 0xF6 (十六进制)
== 规定: 1000 0000 = -128 (因为发生了截断)==
4、大小端问题:
内存访问的基本单位是字节,只要是字节,每个字节都有地址(大小)
数据按照字节为单位,可以被划分成若干部分,每一部分对应的“权值”是不同的,只要权值不同,就也有高低
权值: 比如 1 1 1 1 1 1 1 1 (二进制序列)
它的每一位分别对应权值为:
(从左往右按照位数(从0开始):二的多少次方)
2^7 … 2^0
把数据的低权值字节数据,放在了低地址字节里面,这种存放方式,就叫做小端;(小小小)
把数据的低权值字节数据,放在了高地址字节里面,这种存放方式,就叫做大端;
知识小练:
code 1:
运行时打开内存监视,便于查看二进制存储(大小端)
int a = 1;
printf("a=%d\n", *(char*)&a);
1 的二进制序列: 0x00 01 — 01 处于低权值
(01 存储在低地址中,故为小端存储)
code 2:
char a = -1;
signed char b = -1;
unsigned char c = -1;
printf("a=%d,b=%d,c=%d", a, b, c);
注意:打印是是以 %d 形式(十进制整数形式)
结果:
a —char 类型
b---- signed char 有符号
c---- unsigned char 无符号
-1 == 1000 0001 (二进制)
code 3:
char a = -128; printf("%u\n", a);
%u 表示输出无符号型十进制数
-128 == 1000 0000
1111 1111 1111 1111 1111 1111 1000 0000 232-27
char 类型占 8 个 bit 位,要以 %u 形式输出需要补够 32 bit 位(因为是负数所以补 1)
结果:2^32 -2^7
code 4:
char a = 128; //1000 0000
printf("%d\n", a): //int [-128~127]
1111 1111 1111 1111 1111 1111 1000 0000
(1000 0000 按最高位 1 进行补够 32 bit 位) -1,取反
1111 1111 1111 1111 1111 1111 0111 1111 (-1 减 1)
1000 0000 0000 0000 0000 0000 1000 0000 (取反)
所以输出结果为:-128
code 5:
int i = -20;unsigned int j = 10;printf("%d\n", i + j);
1000 0000 0000 0000 0000 0000 0001 0100 -20
1111 1111 1111 1111 1111 1111 1110 1011 -20 反码
1111 1111 1111 1111 1111 1111 1110 1100 -20补码
0000 0000 0000 0000 0000 0000 0000 1010 10
(正数:原码=反码=补码)
1111 1111 1111 1111 1111 1111 1111 0110 -20+10
(补码相加)
1111 1111 1111 1111 1111 1111 1111 0101 反码=补码-1
1000 0000 0000 0000 0000 0000 0000 1010 原码
(反码取反) -10
(补码 形式存储在计算机中,给计算机识别的;而 原码 是给人看的)
结果:
code 6:
unsigned int i; // i无符号数,[0-i] >=0 会形成死循环for (i = 9; i >= 0; i--) {printf("%u\n", i);}
%u 无符号十进制数 [0-i] >=0 会形成死循环
i 属于无符号数,[0~255]
code 7:
int main()
{char a[1000] = { 0 };int i = 0;for (i = 0; i < 1000; i++){a[i] = -1 - i;}printf("%d", strlen(a)); // strlen 计算字符串长度 ,遇到'\0'就停止 return 0;
}
a[0]=-1-0 // 1000 0001 (-1) ------ 1111 1110(反码)-----
1111 1111 (-1补码)
a[1]=-1-1 // 1111 1111 + 1111 1111 = 1 1111 1110 — 发生截断 1111 1110 (补)— 1111 1101 (反)------ 1000 0010
(-2 原码)
a[2]=-1-2 // 1111 1111 + 1111 1110 = 1 1111 1101 ----截断 1111 1101 (补码)------1111 1100(反)--------
1000 0011(-3原码)
a[127]=-1-127 //1111 1111 + 1000 0001 = 1 1000 0000 ----
截断 1000 0000 (-128补码)
[-1 ~ -128] 共128个数
a[128]=-1-128 //1111 1111 + 1000 0000 = 1 0111 1111 ----
截断 0111 1111 (127)
a[129]=-1-129 //1111 1111 + 1 0111 1111 = 10 0111 1110 ----
截断 0111 1110 (126)
…
a[]=0
[127 ~ 0] 共128 个数 --------- 128+128= 256 一共 256 个数据,第 a[256] = 0 不计算在内,所以结果为255
code 8:
unsigned char i = 0;
int main()
{for (i = 0; i <= 255; i++) {printf("hello world");}system("pause");return 0;
}
死循环
255+1 (0) 1111 1111 +1 = (1) 1111 1110—补码 —
0000 0010—原码
code 9:
在int main()
{unsigned char a = 200;unsigned char b = 100;unsigned char c = 0;c = a + b;printf("%d %d", a + b, c);return 0;
}
c=a+b 将无符号a+b 的值赋给unsigned char 类型c
而 a+b 直接输出时候并没有赋给某个类型,%d 打印
结果:
二进制数的三种形式-----原反补相关推荐
- access的否定形式_“肯定形式”表示“否定含义”三种形式
在日常交流中,直接的否定在表达情感和观点时显得浅显易懂,尽管它们有的时候并不那么符合语法要求.比如,好久不见(long time no see);或者,没钱什么都不行(no money, no goo ...
- 素数计数公式全面拉丁化改写-小有改进-Meissel公式-梅塞尔-Lehmer公式-莱梅=勒梅尔-筛法三种形式-孟庆余公式(转载)...
何冬州的百度空间Blog 本文的另一版本: http://hi.baidu.com/wsktuuytyh/blog/item/396a934ac679680208f7ef2c.html 信 ...
- FMDB使用的数据库的三种形式
FMDB使用的数据库的三种形式 FMDB是iOS平台下一款优秀的第三方SQLite数据库框架.它以Objective-C的方式封装了SQLite的C语言API.使用起来,它更加面向对象,避免冗余的C语 ...
- 批量梯度下降 linux,梯度下降的三种形式BGD,SGD,MBGD(MSGD)
梯度下降的三种形式BGD,SGD,MBGD: Batch gradient descent: Use all examples in each iteration: Stochastic gradie ...
- 1. 变量提升 2. 条件语句 3. 循环语句 弹出框的三种形式 If条件的种类...
1. 变量提升 变量提升是浏览器的一个功能,在运行js代码之前,浏览器会给js一个全局作用域叫window ,window分两个模块,一个叫内存模块,一个叫运行模块,内存模块找到当前作用域下的 ...
- java光标移动函数_文件内光标的移动 函数基础 定义函数的三种形式 函数的返回值 调用方式...
# with open(r'a.txt', 'r', encoding='utf-8')as f: # data1=f.read() # print('>1>:',data1) # pri ...
- 创建Git仓库的三种形式
创建Git仓库的三种形式: 2种本地创建和远程拉取 文章目录 1. 在idea中初始化仓库 1.1. 进入目录,初始化仓库 1.2. git init 目录名 1.3.1 远程拉取 1. 在idea中 ...
- 梯度下降法的三种形式批量梯度下降法、随机梯度下降以及小批量梯度下降法
梯度下降法的三种形式BGD.SGD以及MBGD 梯度下降法的三种形式BGD.SGD以及MBGD 阅读目录 1. 批量梯度下降法BGD 2. 随机梯度下降法SGD 3. 小批量梯度下降法MBGD 4. ...
- php数组书写形式,php数组(array)输出的三种形式讲解
php数组(array)输出的三种形式讲解 发布于 2015-01-30 15:57:43 | 119 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hyperte ...
最新文章
- keras如何解决局部最小问题
- C++中string查找和取子串和整形转化
- Django中提供的6种缓存方式
- Windows 7 下月停止支持,微软重申将全屏通知敦促用户升级系统
- 配置文件详解_Keepalived配置文件详解
- python 词云手把手_手把手教你用python制作属于你的第一个词云
- Firefox 18周岁
- pc网站和移动网站在同一服务器吗,机动都市阿尔法PC服和移动服互通吗
- Android项目架构设计深入浅出
- EasyUI-右键菜单变灰不可用效果
- 35岁程序员失业后感慨:之前月薪2万,现在找5千的工作都没人要
- 2017商业科技市场预测:云计算改变行业的十大关键发展
- 常见的多种在线代码编辑器
- uniapp中使用moment.js日期插件
- Python数据挖掘实战-唐宇迪-专题视频课程
- 15b万用表怎么测电容_怎么判断启动电容好坏_启动电容怎么测量好坏_数字万用表测电容好坏...
- 删除Windows中设备与驱动器下的多余图标
- ModSecurity web application firewall (WAF) Research - .Little Hann
- 【波段分析】揭秘主力做庄波段分析指标支持多分时级别
- 实施化工厂人员定位的原因详解--新导智能