首页 > 其他分享 >C语言 03 原码 反码 补码

C语言 03 原码 反码 补码

时间:2024-03-23 14:25:13浏览次数:30  
标签:03 0000 补码 1111 128 反码 原码 1000

原码

计算机中所有的数字都是使用 01 这样的二进制数来进行表示的。

这时如果要存储一个数据,比如十进制的 3,那么就需要使用 2 个二进制位来保存,二进制格式为 11,占用两个位置,称为 2 bit 位。

一般占用 8 个 bit 位表示一个字节(B)2 个字节等于 1 个字,所以一个字表示 16 个 bit 位

数字的直接二进制表示称为原码

虽然原码表示简单,但是原码在做加减法的时候,就会出现问题。

以 8 bit 位为例:

  1 + (-1)
取原码:
  0000 0001
  +
  1000 0001
  =
  0000 1010 
取十进制:
  -2

显然结果应该为 0-2 的结果是错误的。

为了解决这一问题,引入了反码

反码

正数的反码是其本身。
负数的反码是其原码符号位不变,其余各位取反。

经过上面的定义,再来进行加减法:

  1 + (-1) 
原码:
  0000 0001 
  + 
  1000 0001 
反码: 
  0000 0001 
  + 
  1111 1110 
   =
  1111 1111 
逆反码(取反): 
  1000 0000
十进制:
  -0

这样虽然结果看起来对了。
但如果 1111 1111 代表 -00000 0000 代表 +0
+0-0 都等于 0
一个 0 用两个二进制数表示,既浪费也不合理,所以又引入了补码

补码

正数的补码就是其本身
负数的补码是其原码符号位不变,其余各位取反(得到反码),最后 + 1

再来看上面的运算:

  1 + (-1) 
原码:
  0000 0001 
  + 
  1000 0001 
反码: 
  0000 0001 
  + 
  1111 1110
补码:
  0000 0001
  +
  1111 1111
  =
  1 0000 0000  
省略高位: 
  0000 0000
逆补码(本身):
  0000 0000
逆反码(本身):
  0000 0000
十进制:
  0

这样就得到了预期的 0

可以看出,补码是计算机数字存储和运算的完美解决方案,所以计算机中的数字都是以补码存储

C 语言使用的也是补码。

取值范围

按照上面原码的定义,可以根据位数推出取值范围。

比如现在一共有 8 bit 位来保存数据,为了表示正负,可以让第一个 bit 位专门来保存符号,这样能够表示的数据范围就是:

  • 最小:1111 1111 => -127
  • 最大:0111 1111 => 127

这里就有个疑问了,我们熟知的 char 占一个字节,也就是 8 bit 位,但它的取值范围是 -128 ~ 127

-128 是从何而来呢?

计算机中的数字都是以补码存储,则:

  -128
二进制:
  1 1000 0000
逆补码(-1):
  1 0111 1111
逆反码(取反):
  1 1000 0000
十进制:
  -128

可以看出,补码 -128 的原码也是 -128
由于是用 8 bit 位存储数据,1 1000 0000 所以应该舍弃最高位的 1
由此得到 1000 0000
按照惯性思维,1000 0000 应该为 -0
但前面说了,有了 0 不需要 -0
所以就用 1000 0000 表示 -128

这样运算也是不影响结果的:

  1 + (-128) 
原码:
  0000 0001 
  + 
    1000 0000
    =
    1000 0001
逆补码(-1):
    1000 0000
逆反码(取反):
  1111 1111
十进制:
  -127

再来看看代码的运行结果:

#include <stdio.h>

int main() {
    char c = -128;
    printf("%d", c);
}
-128
#include <stdio.h>

int main() {
    char c = -128;
    printf("%d", c + 1);
}
-127

由此可以看出计算机正是这样运算的。

标签:03,0000,补码,1111,128,反码,原码,1000
From: https://www.cnblogs.com/skysailstar/p/18091055

相关文章

  • 前端学习<一>HTML——03初识HTML
    编辑器相关前端开发的编辑器软件,我首先推荐VSCode,其次推荐SublimeText。有人说WebStorm也不错?但真实情况是,自从VSCode问世之后,用WebStorm的人越来越少了。PS:文件的后缀名不能决定文件格式,只能决定打开文件打开的方式。VSCode的使用详情请移步至:后续主页更新S......
  • Linux操作系统学习2024.03.23
    Linux操作系统学习目标2024.03.23一.操作系统1.1作用:主要作用是管理好硬件设备,并为用户和应用程序提供一个简单的接口,以便于使用,作为中间人,连接软件和硬件。1.2不同应用领域的主流操作程序·桌面操作系统:1.Windows系列2.macOS3.Linux·服务器操作系统:1.Linux2.Windows......
  • SpringBoot 面向面试学习(2023.03.23更新)
    导语在网上找了很多SpringBoot相关的教程,要么是针对初学者面向实战入门的视频,要么基于面试但存在收费或不全面的问题……因此参考网上博客特此总结了一些可能常见的面试题,循序渐进,以问题为导向,以面试为场景进行学习/复习。JavaGuide提供的Spring常见面试题总结可以去看,里面......
  • 2024-03-23 闲话
    突然思考如果我要写论文,那么intro的background怎么写。仔细分析了一下,发现每篇论文的第一段是大同小异的,所以直接粘过来改改措辞就行了。剩下的motivation就可以自己发挥了。practitionern.执业人员,从业者incaseof以防万一inthecaseof在某种情况下frictio......
  • 2024-03-22
    \({\color{orange}\star}\)2024-03-22\({\color{orange}\star}\)模积和#题目描述#求\[\sum_{i=1}^{n}\sum_{j=1}^{m}(n\bmodi)\times(m\bmodj),i\neqj\]\(\bmod19940417\)的值#Solution#不妨设\(n\lem\)容斥原理\[\sum_{i=1}^{n}\sum_......
  • STM32G431RBT6之LCD03
    导入三个文件lcd.c&&lcd.h&&fonts.h  初始化&&界面显示LCD_Init();LCD_Clear(Black);LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);chartemp[20];LCD_DisplayStringLine(Line1,(u8)"DATA");spri......
  • 20240322打卡
    第四周第一天第二天第三天第四天第五天第六天第七天所花时间1h5h3h1.5h0h代码量(行)2123592745470博客量(篇)11111知识点了解Kotlin编写用户注册与登录功能jetpack的深入使用hilt依赖注入与kotlin协程等知识了解蓝桥杯题目练习osu......
  • L2-039 清点代码库
    没有想到map的key可以是数组类型,本质是vector模板中运算符的重载。1.==重载:判断两个数组是一样的,含义是两个vector大小相同,并且固定位置上的值要相等。//stl_vector.htemplate<classT,classAlloc>inlinebooloperator==(constvector<T,Alloc>&x,constvector<T,Al......
  • MindSponge分子动力学模拟——自建力场(2024.03)
    技术背景在MindSponge教程合集中我们已经介绍了很多使用MindSponge进行分子动力学模拟的方法,这里主要介绍在MindSponge中自定义一个力场。在传统的MD软件中,如果你希望去开发一个自己的力场,或者是添加一些分子动力学模拟方法如增强采样等,会面临不少编程上的困难。而这些困难对于使......
  • C# 03 数据类型及转换
    类型:integer(int)、double、long:数値型string:文字型boolean:布尔型写法:inti=int.Parse("1234");longl=long.Parse("1234");doubled=double.Parse("124.3");boolb=bool.Parse("True");stringstr=i.ToString(); 时间Da......