原反补的基本概念:

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 打印

结果:

二进制数的三种形式-----原反补相关推荐

  1. access的否定形式_“肯定形式”表示“否定含义”三种形式

    在日常交流中,直接的否定在表达情感和观点时显得浅显易懂,尽管它们有的时候并不那么符合语法要求.比如,好久不见(long time no see);或者,没钱什么都不行(no money, no goo ...

  2. 素数计数公式全面拉丁化改写-小有改进-Meissel公式-梅塞尔-Lehmer公式-莱梅=勒梅尔-筛法三种形式-孟庆余公式(转载)...

    何冬州的百度空间Blog   本文的另一版本:  http://hi.baidu.com/wsktuuytyh/blog/item/396a934ac679680208f7ef2c.html    信 ...

  3. FMDB使用的数据库的三种形式

    FMDB使用的数据库的三种形式 FMDB是iOS平台下一款优秀的第三方SQLite数据库框架.它以Objective-C的方式封装了SQLite的C语言API.使用起来,它更加面向对象,避免冗余的C语 ...

  4. 批量梯度下降 linux,梯度下降的三种形式BGD,SGD,MBGD(MSGD)

    梯度下降的三种形式BGD,SGD,MBGD: Batch gradient descent: Use all examples in each iteration: Stochastic gradie ...

  5. 1. 变量提升 2. 条件语句 3. 循环语句 弹出框的三种形式 If条件的种类...

    1.     变量提升 变量提升是浏览器的一个功能,在运行js代码之前,浏览器会给js一个全局作用域叫window ,window分两个模块,一个叫内存模块,一个叫运行模块,内存模块找到当前作用域下的 ...

  6. java光标移动函数_文件内光标的移动 函数基础 定义函数的三种形式 函数的返回值 调用方式...

    # with open(r'a.txt', 'r', encoding='utf-8')as f: # data1=f.read() # print('>1>:',data1) # pri ...

  7. 创建Git仓库的三种形式

    创建Git仓库的三种形式: 2种本地创建和远程拉取 文章目录 1. 在idea中初始化仓库 1.1. 进入目录,初始化仓库 1.2. git init 目录名 1.3.1 远程拉取 1. 在idea中 ...

  8. 梯度下降法的三种形式批量梯度下降法、随机梯度下降以及小批量梯度下降法

    梯度下降法的三种形式BGD.SGD以及MBGD 梯度下降法的三种形式BGD.SGD以及MBGD 阅读目录 1. 批量梯度下降法BGD 2. 随机梯度下降法SGD 3. 小批量梯度下降法MBGD 4. ...

  9. php数组书写形式,php数组(array)输出的三种形式讲解

    php数组(array)输出的三种形式讲解 发布于 2015-01-30 15:57:43 | 119 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hyperte ...

最新文章

  1. keras如何解决局部最小问题
  2. C++中string查找和取子串和整形转化
  3. Django中提供的6种缓存方式
  4. Windows 7 下月停止支持,微软重申将全屏通知敦促用户升级系统
  5. 配置文件详解_Keepalived配置文件详解
  6. python 词云手把手_手把手教你用python制作属于你的第一个词云
  7. Firefox 18周岁
  8. pc网站和移动网站在同一服务器吗,机动都市阿尔法PC服和移动服互通吗
  9. Android项目架构设计深入浅出
  10. EasyUI-右键菜单变灰不可用效果
  11. 35岁程序员失业后感慨:之前月薪2万,现在找5千的工作都没人要
  12. 2017商业科技市场预测:云计算改变行业的十大关键发展
  13. 常见的多种在线代码编辑器
  14. uniapp中使用moment.js日期插件
  15. Python数据挖掘实战-唐宇迪-专题视频课程
  16. 15b万用表怎么测电容_怎么判断启动电容好坏_启动电容怎么测量好坏_数字万用表测电容好坏...
  17. 删除Windows中设备与驱动器下的多余图标
  18. ModSecurity web application firewall (WAF) Research - .Little Hann
  19. 【波段分析】揭秘主力做庄波段分析指标支持多分时级别
  20. 实施化工厂人员定位的原因详解--新导智能

热门文章

  1. 矩阵乘以一个系数和行列式乘以一个系数
  2. ETag 和 Last-modified
  3. [Rx86OS-XIX] 应用程序和系统调用
  4. 输入三个城市名,按照升序显示
  5. 软件测试的行业现状,我们的未来在哪里?
  6. android面试题2020!年末阿里百度等大厂技术面试题汇总,社招面试心得
  7. BAT 批处理脚本 教程
  8. c语言创建一个bat文件内容,BAT(批处理)文件编写详细手册
  9. Eclipse MAT 内存分析工具
  10. 《数学之美》读书记录【思维导图记录】:第五章,隐含马尔可夫模型