有符号数和无符号数详解

2023-11-13


有符号数和无符号数详解(2)补码详解
https://blog.csdn.net/lqy971966/article/details/106130830

1. 通过例子看问题

unsigned int uint;
int i = -1;
uint = i;
printf("%x %u %d\n", uint, uint, uint);
printf("%x %u %d\n", i, i, i);
//输出
	ffffffff 4294967295 -1
	ffffffff 4294967295 -1
/*
	因为 根据打印格式打印的
	%d 有符号32位整数
	%u 无符号32位整数
	%lld 有符号64位整数
*/
uint = 0xffffffff;
i = uint;
printf("%x %d\n", uint, i);
//输出ffffffff -1

int j = -1;
printf("%x\n", (~j));
//输出0

int k = 1;
printf("%x\n", (~k);
//输出0xfffffffe

char c = 1;
printf("%d\n", (~c));
//输出-2

因为: 
 char c = 1;
printf("%x\n", c); //1
printf("%x\n", (~c)); //fffffffe
printf("%d\n", (~c));//-2

如果以上例子看的没问题,那你就不用往下看了!哈哈~~

2. 有符号数和无符号数

2.1 什么是无符号数 ?

无符号数(unsigned number) 是相对于有符号数而言的,
指的是整个机器字长的全部二进制位均表示数值位,相当于数的绝对值。
如: 32位操作系统中
(普及概念:

  1. 8位的CPU,一次只能处理一个8位的“数据”或者一个8位的"指令"。比如’00001101’。

  2. 32位CPU一次能处理32位的数据或者一个32位的指令。
    如 00000001 00000011 00000111 00001111)

    unsigned int iMinNum = 0;
    unsigned int iMaxNum = 0xffffffff;
    printf(“iMinNum = %u, iMaxNum = %u\n”, iMinNum, iMaxNum);
    结果:
    –》iMinNum = 0, iMaxNum = 4294967295

其中,无符号数32位的取值范围是: 0~4294967295
注意:%u 无符号32位整数

2.2 什么是有符号数 ?

有符号数(signed number) 和无符号数基本相同,不同的是:一般用最高有效位(MSB)来表示数的符号,正数用0表示,负数用1表示。
如: 32位操作系统中

int iMinNum = 0x80000000; //1000 0000 0000 0000 0000 0000 0000 0000 
int iMaxNum = 0x7fffffff; //0111 1111 1111 1111 1111 1111 1111 1111
printf("iMinNum = %d, iMaxNum = %d\n", iMinNum, iMaxNum);
结果:
iMinNum = -2147483648, iMaxNum = 2147483647

其中,有符号数32位的取值范围是: -2147483648~2147483647
二进制表示:
最小值: 1000 0000 0000 0000 0000 0000 0000 0000
最大值: 0111 1111 1111 1111 1111 1111 1111 1111
因为: 在有符号数中,最高位所代表的值是- 2^ 31 ,而不是-1
注意:%d 有符号32位整数

2.3 有符号数和无符号数的区别

  1. 有符号数和无符号数的区别:
    在32位编译器中,有符号数的二进制位最高位表示-2^ 31,而无符号数的二进制位最高位表示的是2^31
  2. 无论它是有符号数还是无符号数,它的二进制表示肯定都是唯一的
    (不可能在有符号形式下有一种表示,在无符号形式下也有一种表示)

3. 原码、反码、补码

3.1 背景

  1. 负数表示问题
    在数学中,任意基数的负数都在最前面加上“−”符号来表示。
    在计算机硬件中,数字都以无符号的二进制形式表示。
    但是负数如何用二进制表示呢?
  2. 解决:
    当前通过:原码、反码、补码,用于扩展二进制数字系统,来表示有符号数。

3.2 原码、反码、补码

3.2.1 什么是机器数?

机器数就是 数在计算机中的二进制表示形式。
机器数是带符号的,在计算机中用二进制数的最高位存放符号, 正数为0, 负数为1。
例如:

  1. 计算机字长为8位,则:
    十进制数+3 ,转换成二进制00000011,
    十进制数-3 ,转换成二进制10000011。
    那么,这里的00000011和10000011就是机器数。

3.2.2 什么是真值?

真值就是真正的值。
因为二进制数的最高位是符号位,所以机器数的形式值就不等于真正的数值。
为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
即第一位用±表示数字的正负,其余为二进制数。
例如:
0000 0001的真值= +000 0001,1000 0001的真值= –000 0001。

3.2.3 原码、反码、补码

  1. 原码:
    就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。

     例如:
     1 的源码 0000...0001
     -1的原码:1,000...0001
    
  2. 反码:
    正数的反码是其本身
    负数的反码是在其原码的基础上, 符号位不变,其余各个位取反

     例如:
     1的反码还是1
     如-1的补码为1,111...1110
    
  3. 补码:
    正数的补码就是其本身
    负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1

     例如:
     1的补码还是1
     -1的补码为1,111...111
     (这就解释了无符号-1 = 1111…1111 = 4294967295)
    

因为: 在有符号数中,最高位所代表的值是- 2^ 31 ,而不是-1

4. -1 和 0xFFFFFFFF问题

上面的补码就解释了 -1 和 0xFFFFFFFF的问题
有符号 -1 的二进制表示就是以补码形式表示,即: 0xffffffff ( =2 ^ 31 +2 ^ 30+…+2 ^ 1+2 ^ 0=- 2 ^ 31+2 ^ 31-1=-1)

unsigned (-1)表示无符号整数的最大值 即: 4294967295(二进制全1)
因此,unsigned(-1)=1,111…111(共32个1)。表示unsigned的最大值。
也就是0xFFFFFFFF

5. 计算机为什么采用补码来进行运算

https://blog.csdn.net/m0_37955444/article/details/79848485

有符号数和无符号数详解(2)补码详解
https://blog.csdn.net/lqy971966/article/details/106130830

参考

https://blog.csdn.net/qq_28114615/article/details/85884280
https://blog.csdn.net/weixin_38825407/article/details/86297969
https://blog.csdn.net/weixin_40825228/article/details/81136554
https://blog.csdn.net/baidu_33725271/article/details/69801949
https://www.cnblogs.com/Wubg/p/5813595.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有符号数和无符号数详解 的相关文章

  • MySQL基础(非常全)

    MySQL基础 一 MySQL概述 1 什么是数据库 答 数据的仓库 如 在ATM的示例中我们创建了一个 db 目录 称其为数据库 2 什么是 MySQL Oracle SQLite Access MS SQL Server等 答 他们均是
  • Win11微软账号登录不上?Win11登录Microsoft账户出错的解决方法

    Win11微软账号登录不上 近期有部分Win11用户反映在登录微软账号会出现一直转圈 无法登录的情况 这样导致部分功能都不能正常使用了 为此十分令人头疼 那么对于这一情况 有没有什么方法可以有效的解决呢 下面小编教给大家操作方法 大家可以去
  • redis主从同步,总是显示master_link_status:down的解决方法

    前几天 在修改一台从节点的redis的监听端口后 重启了下redis 发现master link status 很长时间一直都是down状态 查看了redis日志 发现日志里出现很多的 I O error trying to sync wi
  • 计算机领域中随处可见的抽象

    想要管理多种具体的东西 那么需要遵守每种东西的规范 如果想要提供一种通用模式来对这些具体的东西统一管理 需要使用一种古老的技术 抽象 抽象是将多种具体的东西 管理时需要遵守的规范 的共同点抽取出来 放入到更高一层的抽象层 在抽象层不定义或少
  • pycharm内存不足时如何修改设置?

    Help gt Find Action gt type VM Options gt Click Edit Custom VM Options Pycharm 2016 2 will open the appropriate vmoption
  • Client-Server问题

    1 实验内容与要求 需要创建客户Client和服务器Server两个进程 它们通过管道进行通信 Client进程派生3个生产者线程 一个管道线程 共享一个20个slots的缓冲区 每个生产者线程随机产生一个数据 打印出来自己的id 进程 线
  • ps aux 和ps -aux和 ps -ef的选择

    Linux中的ps命令是Process Status的缩写 ps命令用来列出系统中当前运行的那些进程 ps命令列出的是当前那些进程的快照 就是执行ps命令的那个时刻的那些进程 如果想要动态的显示进程信息 就可以使用top命令 要对进程进行监
  • 设备管理过程

    复杂度2 5 机密度2 5 最后更新2021 04 19 AIX中对设备会有如下五个操作 define aix下能看到设备的定义 但驱动程序并没有加载或初始化 该设备不可用 lsdev看到设备时defined 很多逻辑设备 vg lv等 只
  • JSON.stringify()

    JSON stringify 将一个JavaScript值 对象或者数组 转换为一个 JSON字符串 如果指定了replacer是一个函数 则可以选择性的替换值 或者如果指定了replacer是一个数组 可选择性的仅包含数组指定的属性 语法
  • 为什么计算机中的整数要用补码表示?补码表示有什么好处?

    为什么计算机中的整数要用补码表示 补码表示有什么好处 在计算机中 补码可谓是十分神奇而又重要的存在 我们知道整数在计算机内部的机器数一般都是补码表示的 这里给出几个这样表示的好处 符号位可以和数值为一起参加运算 比如俩个负数相加 只要结果在
  • office2013 excel 打开时提示excel词典xllex.dll文件丢失或损坏

    今天打开Excel时 发现报错 xllex dll文件丢失或损坏 我用的是office2013 网上找了好多都是2007的dll文件 导入不了 于是乎重装office 问题解决 但还是把xllex dll烤出来做个备份吧 参考下面步骤即可
  • 红帽7.9部署telnet服务

    升级ssh 为预防万一提前配置telnet服务 安装软件包 yum install telnet server yum install xinetd xinetd加入开机自启 systemctl enable xinetd service
  • 操作系统笔记六(文件管理)

    1 文件逻辑结构 1 1逻辑结构的文件类型 分类 有结构文件 例如 PNG文件 无结构文件 1 2顺序文件 1 3索引文件 2 辅存的存储空间分配 2 1分配方式 连续分配 直接分配连续的存储空间 链接分配 隐式链接 在盘块内指定下一个盘块
  • Linux,Network manager 导致节点异常重启

    推断是Network manager 导致的 原因待查今天在VmWare的虚拟机上装了个测试RAC 又遇到了一个摸不到头绪的问题CRS装好后 一旦登陆图形界面 节点就重启 事情就有这么巧不登陆图形界面 观察了1个小时没问题 一旦登陆后 立刻
  • Windows运行常用命令(win+R)

    1 calc 启动计算器 2 notepad 打开记事本 3 write 写字板 4 mspaint 画图板 5 snippingtool 截图工具 支持无规则截图 6 mplayer2 简易widnows media player 7 S
  • Windows驱动开发(一)第一个驱动程序

    首先我们需要了解 在操作系统中 是分两种权限的 一种是内核态 我们也称为0环 一种是用户态 称之为3环 而在我们的电脑中 驱动程序是运行在内核态的 这意味着和操作系统内核是在同一权限的 而普通的应用程序的权限是最低的 高权限谁不想拥有呢 因
  • CentOS Linux服务器安全设置

    转自 http www osyunwei com archives 754 html 引言 我们必须明白 最小的权限 最少的服务 最大的安全 所以 无论是配置任何服务器 我们都必须把不用的服务关闭 把系统权限设置到最小话 这样才能保证服务器
  • 如何快速构建CMBD系统-glpi

    脚本后续更新及迭代将由kkitDeploy项目代替 https github com luckman666 kkitdeploy server 请大家持续关注kkitDeploy 一 CMBD系统构建步骤 起初 开发这套CMBD系统是为了帮
  • gdb attach 进程调试

    gdb调试正在运行的进程 GDB可以对正在执行的程序进行调度 它允许开发人员中断程序 并查看其状态 之后还能让这个程序正常地继续执行 gdb attach xxxxx xxxxx为利用ps命令获得的子进程process
  • 【操作系统xv6】学习记录4-一级页表与二级页表

    占位

随机推荐

  • mysql数据库自动重新连接_数据库连接池自动重新连接问题

    http sailorls blogchina com 2606862 html tomcat连接池自动重新连接问题 Tag Tag tomcat 连接池 重新连接 在以往的开发中 常常遇到tomcat连接池断掉后 比如网络断线 无法自动重
  • 大文件上传断点续传具体实现

    是什么 不管怎样简单的需求 在量级达到一定层次时 都会变得异常复杂 文件上传简单 文件变大就复杂 上传大文件时 以下几个变量会影响我们的用户体验 服务器处理数据的能力 请求超时 网络波动 上传时间会变长 高频次文件上传失败 失败后又需要重新
  • java循环删除文件数组失败

    背景 后台java处理从服务器下载已有的N个文件成临时文件 压缩成压缩文件后 重新上传新的压缩文件 循环删除临时文件数组 file delete 只删除成功最后一个 过程 已确认无未关闭的流 无占用文件资源 循环删除就是只删除最后一个 删除
  • canvas学习(十):font字体设置

    canvas中的字体设置比较简单 这里就不说别的了 直接上实例代码 window nl ad function var myCanvas document getElementById myCanvas if myCanvas getCon
  • IntelliJ IDEA 的chatGPT插件 Bito

    1 chatGPT爆火 最近你是否听说过 ChatGPT 这个词 它指的是一种基于深度学习技术的人工智能语言生成模型 自从2018年由OpenAI发布以来 ChatGPT就备受关注 甚至在2022年成为了全球最强AI模型之一 2 chatG
  • Chrome 谷歌浏览器账户无法登录、注册

    Chrome 谷歌浏览器账户无法登录 注册 背景 步骤 1 2 3 4 5 6 亲测有效 但这只是其中一种 背景 通过某些方法 登录了Google浏览器 注册Google账号时发现 点击登录或者注册后 网页没有任何响应 通过查询网上资料后
  • C语言初学:比较两个数的大小

    比较两数大小 1 利用if else输出较大值 include
  • Java设计模式-解释器模式

    解释器模式 在软件开发中 会遇到有些问题多次重复出现 而且有一定的相似性和规律性 如果将它们归纳成一种简单的语言 那么这些问题实例将是该语言的一些句子 这样就可以用 编译原理 中的解释器模式来实现了 虽然使用解释器模式的实例不是很多 但对于
  • element 表格嵌套 switch 踩坑

    因为项目需求 需要在表格中插入开关 当前的组件并不支持 手写了个简易demo 记录一下踩坑历程
  • 网站架构演变过程之微服务概念描述

    传统架构 传统的SSH架构 分为三层架构 web控制层 业务逻辑层 数据库访问层 传统架构也就是单点应用 就是大家在刚开始初学JavaEE技术的时候SSH架构或者SSM架构 业务没有进行拆分 都写同一个项目工程里面 一般是适合于个人或者是小
  • 企业使用VMware vSphere进行服务器虚拟化的经验分享

    企业使用VMware vSphere进行服务器虚拟化的经验分享 对于很多中小企业来说 虚拟化已经成为节省IT开支的一种重要手段 下面就根据公司Vmware虚拟化产品部署案例 同大家来详细分享一下在使用vSphere产品组建虚拟化数据中心的一
  • python中列表数据类型_python基础数据类型一(列表)

    列表 表是python的基础数据类型之一 其他编程语言也有类似的数据类型 比如JS中的数 组 java中的数组等等 它是以 括起来 每个元素用 隔开而且可以存放各种数据类型 列表是python中的基础数据类型之一 其他语言中也有类似于列表的
  • Python的PyYAML模块详解

    文章目录 简介 安装 简单安装 从源码安装 最常被问到的问题 使用详解 加载YAML 转储YAML 构造 表示和解析 YAML语法 文档 块序列 块映射 流集合 标量 别名 标签 YAML标签和Python3 对象 字符串转换 名称和模块
  • LaTeX Error: File `tabu.sty‘ not found.

    虽然Miktex可以自动下载和安装没有的库 但有些时候也有可能会直接报错 LaTeX Error File tabu sty not found 解决方法就是打开控制台 然后手动下载
  • linux切换用户su自动输入密码,Linux切换用户出现【su:命令鉴定故障】问题&修改的密码位数必须大于8位的问题...

    一 切换到普通用户出现 su 命令鉴定故障 创建用户设置好密码后 从root用户进入普通用户是不需要输入密码的 但是我切换到另一个普通用户 进行普通用户之间的切换的时候 出现了 su 命令鉴定故障 最开始我以为是我密码错误 后来改 也怎么都
  • 互联网小拼,这一生的故事,你要看看吗

    前言 谁也不知道 今天竟然是我的最后一天加班 我叫小拼 我来自农村 一个国家级贫困县 原以为会在老家种田一辈子 谁曾想 考上了一所大学 学了计算机专业改变了我的一生 大学毕业以前都没什么好说的 九年义务教育 再加高中三年 大学四年 毕业后
  • 引领高并发直播场景进入毫秒时代,阿里云发布超低延时直播服务

    近日 阿里云上线超低延时直播服务RTS Real time Streaming 该服务在视频直播产品的基础上 进行全链路延时监控 传输协议改造等底层技术优化 支持千万级并发场景下的毫秒级延迟直播能力 保障低延时 低卡顿 高清流畅的极致直播观
  • C++文件读取

    简介 最近在复习C 在写一个停车场管理系统项目的时候突然遇到了关于文件的处理 感觉忘记的差不多了 重新复习了一下 也顺便写一下笔记 当然在一个文章中有很多细节都没有进行深入的研究 只是知道一些基本的用法 主要感觉在学完数据库后再用文件系统进
  • java基础之内存机制详解

    今天有看到一篇好的关于java内存机制的文章 果断转载过来 哈哈哈哈哈哈 堆区 1 存储的全部是对象 每个对象都包含一个与之对应的class的信息 class的目的是得到操作指令 2 jvm只有一个堆区 heap 被所有线程共享 堆中不存放
  • 有符号数和无符号数详解

    有符号数和无符号数详解 1 通过例子看问题 2 有符号数和无符号数 2 1 什么是无符号数 2 2 什么是有符号数 2 3 有符号数和无符号数的区别 3 原码 反码 补码 3 1 背景 3 2 原码 反码 补码 3 2 1 什么是机器数 3