欢迎大家评论区中指正呀,谢谢大家啦

文章目录

  • 前言:必备知识
  • 一、原码、反码、补码
    • 1、原码
    • 2、反码
    • 3、补码
  • 二、取反 (单目操作符 ~ )
    • 1、数值8
    • 2、数值-8
  • 三、负整数 的 原码、反码、补码
  • 四、正整数 的 原码、反码、补码

前言:必备知识

强调点:1、内存中存储的是 补码,打印显示在电脑屏幕上的是 原码;
2、反码 = 补码 - 1
3、因为计算机中存储是以补码的方式存储,所以我们对一个数取反,要先对它的补码进行取反,然后再求取反后的原码,而不是直接对其原码进行取反。
反码 = 补码 - 1
4、正整数的原码 反码 补码 是一样的;
5、负整数:原码,反码->原码的最高位符号位不变,其余位取反,
补码->反码+1。
6、最高位为1,表示负整数;最高位为0,表示正整数


一、原码、反码、补码

1、原码

原码由二进制原数值部分和符号部分组成
+1010101的原码为01010101,-1010101的原码为11010101,
0:正,1:负

2、反码

正数:反码和原码相同,为符号位加上原数值。
+10010101的反码为010010101
负数:反码为符号位不变加上原数值按位取反。-10010101的反码为101101010

3、补码

正数:补码,原码,反码相同。+110011补码为0110011
负数:补码为符号位加上原数值按位取反后再在最低位加 1,即为反码加 1 。-110011补码为1001101

二、取反 (单目操作符 ~ )

‘~’:单目运算符,对一个数的二进制位 按位取反。
以 8 和 -8 为例:

1、数值8

int main()
{int a = 8;printf("%d ", ~a);return 0;          //输出结果:-9
}
数值 8
原码 0000 0000 0000 1000
反码 0000 0000 0000 1000
补码 0000 0000 0000 1000

因为计算机中存储是以补码的方式存储,所以我们对一个数取反,要先对它的补码进行取反,然后再求取反后的原码,而不是直接对其原码进行取反。

补码取反(此时仍然是补码) 1111 1111 1111 0111(单目运算符~,是对所有二进制位取反)
取反后的反码 1111 1111 1111 0110(反码 = 补码 - 1)
取反后的原码 1000 0000 0000 1001

原码二进制转换为十进制为:-9
故 ~8 = -9

2、数值-8

int main()
{int a = -8;printf("%d    ", ~a);return 0;     //输出结果为:7
}
数值 -8
原码 1000 0000 0000 1000
反码 1111 1111 1111 0111
补码 1111 1111 1111 1000
补码取反(此时仍然是补码) 0000 0000 0000 0111
取反后的反码 0000 0000 0000 0110(反码 = 补码 - 1)
取反后的原码 0000 0000 0000 0110 (正数,原码、反码相同)

原码二进制转换为十进制为:7
故 ~(-8) = 7

三、负整数 的 原码、反码、补码

#include<stdio.h>int main()
{int a = -1;printf("%d    ", ~a);return 0;          //输出结果:0
}

解释:
变量类型 int ,4个字节
-1:
原码:10000000 00000000 00000000 00000001
反码:111111111 111111111 111111111 111111110(符号位不变,其余取反)
补码:111111111 111111111 111111111 111111111 (反码 + 1)

代码中 ~ 是单目运算符:对一个数的二进制位 按位取反

内存中存储的是 补码,按位取反
得到:00000000 00000000 00000000 00000000,这是一个正整数(符号位为0),所以原码、反码、补码是相同的,所以结果为0。
补码取反(此时仍然是补码):00000000 00000000 00000000 00000000
取反后的反码:00000000 00000000 00000000 00000000
取反后的原码:00000000 00000000 00000000 00000000

原码二进制转换为十进制为:0
故 ~(-1) = 0

四、正整数 的 原码、反码、补码

#include<stdio.h>int main()
{int a = 0;printf("%d ", ~a);return 0;          //输出结果:-1
}

解释
0:
原码:00000000 00000000 00000000 00000000
反码:00000000 00000000 00000000 00000000
补码:00000000 00000000 00000000 00000000
因为有 ~ ,所有二进制位按位取反
补码取反(此时仍然是补码):11111111 11111111 11111111 11111111
取反后的反码:11111111 11111111 11111111 11111110 (反码 = 补码 - 1)
取反后的原码:10000000 00000000 00000000 00000001

原码二进制转换为十进制为:-1
故 ~0 = -1

C语言中 原码、反码、补码 以及 取反(单目操作符 ~ )相关推荐

  1. java数字取反_java中源码反码补码与取反的理解

    数字在计算机里是按照二进制来表示的. 箭头朝哪边就是朝哪边移动 补码,反码,和源码 负数原码转化为补码:符号位不变,数值位按位取反,末尾加一. 负数补码转化为原码:符号位不变,数值位按位取反,末尾加1 ...

  2. 关于计算机中 原码, 反码, 补码 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

  3. c语言原码 补码 反码,C语言 原码--反码--补码

    //原码,反码,补码 #include #include //数值的表示方法--原码.反码和补码 //原码:最高位为符号位,其余各位为数值本身的绝对值 //反码: //正数:反码与原码相同 //负数: ...

  4. C语言基础(二)—— 常量与变量、数据类型、进位制、关键字、原码反码补码、限定符、字符串格式化输入输出

    1. 常量与变量 1.1 关键字 1.2 数据类型 数据类型的作用:编译器预算对象(变量)分配的内存空间大小. 1.3 常量 在程序运行过程中,其值不能被改变的量 常量一般出现在表达式或赋值语句中 整 ...

  5. 【濡白的C语言】数据的存储(大小端模式,原码反码补码,浮点数的存储,浮点型精度缺失的原因)

    前言 很多学习C语言之后就会对各种类型感到很烦,但是数据的类型具有相当的意义.首先是类型决定了大小,即该数据在内存中开辟的空间大小:同时不同的类型还决定了数据存储的方式,相同的数据,存入整形与浮点型方 ...

  6. 大端 小端 原码 反码 补码 及内存中的表现

    小端 和 大端 在内存中存储时,都是从内存的低地址往高地址存,即0x00000000 -> 0xffffffff 以汉字 "严"为例,Unicode码是4E25,需要两个字节 ...

  7. python二进制反码例题_python中的进制转换和原码,反码,补码

    python中的进制转换和原码,反码,补码 计算机文件大小单位 b = bit 位(比特) B = Byte 字节 1Byte = 8 bit #一个字节等于8位 可以简写成 1B = 8b 1KB ...

  8. 计算机中的原码,计算机中的原码反码补码移码

    计算机中的原码反码补码移码 原码 数值 X 的原码记为 [X]原,如果机器字长为 n (即采用 n 个二进制位表示数据),则最高位是符号位,0 表示正号,1 表示负号,基余的 n~1 位表示数值的绝对 ...

  9. 浅谈 -128的原码 反码 补码

    以java中byte表示:2字节 8位,-128 首先首位1表示负数,128的正数为1000 0000(其实是-128),然后拼接为1 1000 0000,大于8位,则取低8位,为1000 0000, ...

最新文章

  1. java缓冲流 复制文件_java使用缓冲流复制文件的方法
  2. 就想写个爬虫,我到底要学多少东西啊?
  3. 【MVC】ASP.Net MVC 4项目升级MVC 5的方法
  4. Could not find a version that satisfies the requirement PIL
  5. 用pv操作描述如下前驱图_跟我学PMP | PV、AC、EV…挣值管理的基本概念都是啥?...
  6. 腾讯游戏应邀2019大数据产业峰会BDIC | 荣获“大数据星河奖”并获颁测评证书...
  7. P7443-加边【博弈论】
  8. php网页表格样式,HTML5制作表格样式
  9. dmb显示服务器断开连接,dmb联网信息发布系统操作手册企业加强版.docx
  10. ros_readbagfile:未找到命令的解决方法
  11. 纵深防御及MS纵深防御模型
  12. C++11 override 和 final 关键字
  13. [Android实例教程] 教你如何拍照+相册选择图片+剪裁图片完整实现
  14. 为什么 Java 不支持类多重继承?
  15. java多线程生产消费者_JAVA多线程实现生产者消费者的实例详解
  16. python抓取天气预报_抓取天气预报的代码(Python)
  17. rgba通道转rgb_image – 将RGBA颜色转换为RGB
  18. 毕业设计之 ---- 基于JAVA WEB的网上购物系统的设计与实现
  19. python可视化窗口制作一个摇骰子游戏_通过构建一个简单的掷骰子游戏去学习怎么用 Python 编程...
  20. 我的2013拾遗总结~ 多么痛的领悟!

热门文章

  1. Dvwa之SQL盲注全级别学习笔记
  2. RSA2048签名和加密+OAEP填充方式(前端)
  3. 关于聊天记录数据库表结构设计
  4. Mysql高可用性实施方案
  5. Egg 实现一个 mTime 时光网
  6. 汽车理论matlab编程题,汽车理论1.3及2.7matlab编程答案.doc
  7. SlickEdit V21 2016 破解教程,win linux mac
  8. 推荐一款简洁的浏览器标签页
  9. 上海交通大学计算机系课程表,上海交通大学电子工程系
  10. 数据中心与机房工程有何不同