程序中的负数存储及类型转换

2023-05-16

程序中的负数存储及类型转换

  • 负数在计算机中怎样存储
    • 什么是原码、反码、补码
    • 为什么要设置反码,补码
    • 剖析本质
  • C语言数据类型转换(自动类型转换+强制类型转换)
    • 自动类型转换
    • 强制类型转换
    • 类型转换只是临时性的
    • 自动类型转换 VS 强制类型转换
  • 最后

负数在计算机中怎样存储

什么是原码、反码、补码

分为:正数 和负数(包括正浮点数,和负浮点数)。规定最高位位符号位正数为0,负数为1(原因下文解释)

原码:
10进制转换成2进制是原码,只不过正数的原码是本身符号位为0,负数的原码符号位为1(以下篇幅均以单字节为例:10进制1的原码是0000 0001,10进制-1的原码是1000 0001)。
反码:
正数的反码是本身,负数的反码是负数的原码0变为1,1变为0 (-1的原码是1000 0001 它的反码就是 1111 1110,)。(注意负数求反码时候的符号位不参与变换)。
补码:
正数的补码是本身,负数的补码就是负数的反码加一 (-1的原码是1000 0001 它的反码就是 1111 1110 它的补码就是 1111 1111)。
总结:
正数的原码,反码 ,补码三值合一, 负数的原码,反码,补码不同。

为什么要设置反码,补码

有人会有疑惑为什么要用反码,补码,不直接用原码呢?先搞清楚一点反码补码原码是针对二进制数而言,计算机若用原码相加减,正数加正数不会出错,然而正数和负数原码相加就会出错。
在这里插入图片描述
引进补码的作用是为了让计算机更方便做减法。说白了,补码反码就是为了简化减法而来的,将减号化为负数,再将负数化为补码求加法,跟正数没关系,不管是正整数还是正小数,原码、反码、补码都全部相同。

事实证明计算机中负数是以补码存储的,也可以推广到,计算机中所有数都是以补码形式存储的。

剖析本质

1、单字节无符号的正数可以存储的范围就是0 ~ 255二进制表示( 0000 0000~1111 1111)
2、单字节有负号的整数可以存储的范围是-128 ~127 。
先看正数二进制能表示范围(0000 0001 ~ 0111 1111)即1~127
负数二进制能能表示的范围(1000 0001 ~ 1111 1111)即-127~-1
所以还有个0分为+0和-0 (0000 0000 表示+0,1000 0000 表示-0表示-128)

C语言数据类型转换(自动类型转换+强制类型转换)

自动类型转换

自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生。

1、将一种类型的数据赋值给另外一种类型的变量时就会发生自动类型转换,例如:

float f = 100;

100 是 int 类型的数据,需要先转换为 float 类型才能赋值给变量 f。再如:

int n = f;

f 是 float 类型的数据,需要先转换为 int 类型才能赋值给变量 n。

在赋值运算中,赋值号两边的数据类型不同时,需要把右边表达式的类型转换为左边变量的类型,这可能会导致数据失真,或者精度降低;所以说,自动类型转换并不一定是安全的。对于不安全的类型转换,编译器一般会给出警告。

2、在不同类型的混合运算中,编译器也会自动地转换数据类型,将参与运算的所有数据先转换为同一种类型,然后再进行计算。转换的规则如下:

  • 转换按数据长度增加的方向进行,以保证数值不失真,或者精度不降低。例如,int 和 long 参与运算时,先把 int 类型的数据转成 long 类型后再进行运算。
  • 所有的浮点运算都是以双精度进行的,即使运算中只有 float 类型,也要先转换为 double 类型,才能进行运算。
  • char 和 short 参与运算时,必须先转换成 int 类型。

下图对这种转换规则进行了更加形象地描述:
在这里插入图片描述
unsigned 也即 unsigned int,此时可以省略 int,只写 unsigned。

强制类型转换

自动类型转换是编译器根据代码的上下文环境自行判断的结果,有时候并不是那么“智能”,不能满足所有的需求。如果需要,程序员也可以自己在代码中明确地提出要进行类型转换,这称为强制类型转换。

自动类型转换是编译器默默地、隐式地进行的一种类型转换,不需要在代码中体现出来;强制类型转换是程序员明确提出的、需要通过特定格式的代码来指明的一种类型转换。换句话说,自动类型转换不需要程序员干预,强制类型转换必须有程序员干预。强制类型转换的格式为:

(type_name) expression
//type_name为新类型名称,expression为表达式。例如:
(float) a;  //将变量 a 转换为 float 类型
(int)(x+y);  //把表达式 x+y 的结果转换为 int 整型
(float) 100;  //将数值 100(默认为int类型)转换为 float 类型

下面是一个需要强制类型转换的经典例子:

#include <stdio.h>
int main(){
    int sum = 103;  //总数
    int count = 7;  //数目
    double average;  //平均数
    average = (double) sum / count;
    printf("Average is %lf!\n", average);
    return 0;
}

运行结果:
Average is 14.714286!

sum 和 count 都是 int 类型,如果不进行干预,那么sum / count的运算结果也是 int 类型,小数部分将被丢弃;虽然是 average 是 double 类型,可以接收小数部分,但是心有余力不足,小数部分提前就被“阉割”了,它只能接收到整数部分,这就导致除法运算的结果严重失真。

既然 average 是 double 类型,为何不充分利用,尽量提高运算结果的精度呢?为了达到这个目标,我们只要将 sum 或者 count 其中之一转换为 double 类型即可。上面的代码中,我们将 sum 强制转换为 double 类型,这样sum / count的结果也将变成 double 类型,就可以保留小数部分了,average 接收到的值也会更加精确。

在这段代码中,有两点需要注意:

  • 对于除法运算,如果除数和被除数都是整数,那么运算结果也是整数,小数部分将被直接丢弃;如果除数和被除数其中有一个是小数,那么运算结果也是小数。这一点已在《C语言加减乘除运算》中进行了详细说明。
  • ( )的优先级高于/,对于表达式(double) sum / count,会先执行(double) sum,将 sum 转换为 double 类型,然后再进行除法运算,这样运算结果也是 double 类型,能够保留小数部分。注意不要写作(double) (sum / count),这样写运算结果将是 3.000000,仍然不能保留小数部分。

类型转换只是临时性的

无论是自动类型转换还是强制类型转换,都只是为了本次运算而进行的临时性转换,转换的结果也会保存到临时的内存空间,不会改变数据本来的类型或者值。请看下面的例子:

#include <stdio.h>
int main(){
    double total = 400.8;  //总价
    int count = 5;  //数目
    double unit;  //单价
    int total_int = (int)total;
    unit = total / count;
    printf("total=%lf, total_int=%d, unit=%lf\n", total, total_int, unit);
    return 0;
}

运行结果:
total=400.800000, total_int=400, unit=80.160000

注意看第 6 行代码,total 变量被转换成了 int 类型才赋值给 total_int 变量,而这种转换并未影响 total 变量本身的类型和值。如果 total 的值变了,那么 total 的输出结果将变为 400.000000;如果 total 的类型变了,那么 unit 的输出结果将变为 80.000000。

自动类型转换 VS 强制类型转换

在C语言中,有些类型既可以自动转换,也可以强制转换,例如 int 到 double,float 到 int 等;而有些类型只能强制转换,不能自动转换,例如以后将要学到的 void * 到 int *,int 到 char * 等。

可以自动转换的类型一定能够强制转换,但是,需要强制转换的类型不一定能够自动转换。现在我们学到的数据类型,既可以自动转换,又可以强制转换,以后我们还会学到一些只能强制转换而不能自动转换的类型。

可以自动进行的类型转换一般风险较低,不会对程序带来严重的后果,例如,int 到 double 没有什么缺点,float 到 int 顶多是数值失真。只能强制进行的类型转换一般风险较高,或者行为匪夷所思,例如,char * 到 int * 就是很奇怪的一种转换,这会导致取得的值也很奇怪,再如,int 到 char * 就是风险极高的一种转换,一般会导致程序崩溃。

使用强制类型转换时,程序员自己要意识到潜在的风险。

最后

推荐阅读:C语言教程

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

程序中的负数存储及类型转换 的相关文章

  • PathVariable注解的用法以及报错

    今天碰见个很奇怪的问题 xff0c 因为之前在学校没怎么用过 64 PathVariable这个注解 xff0c 但是postman测试时并没有请求到 xff0c 具体如下 接口就是一个简单的查询详情 xff0c 而当我请求postman的
  • 关于@PreAuthorize注解的使用场景

    作用 64 PreAuthorize 能够在执行方法之前进行权限的认证 xff0c 支持Spring EL表达式 xff0c 基于方法注解和权限解决方案 xff0c 并且只有当 64 EnableGlobalMethodSecurity p
  • 获取 当前时间的前五天凌晨0点的时间

    公司今天提到的需求是 xff1a 每日凌晨两点 xff0c 调用方法 xff0c 方法的内容是 xff1a 拉取当前时间的前五天的0点的消息聊天记录 在网上查了好久才找到 xff0c 现在奉上代码 xff1a span class toke
  • 查询 按照 指定时间的前一天的数据

    需求 xff1a 查询按照指定时间的前一天的数据 xff0c 举个例子 xff1a 传入2023 2 27 xff0c 需要获取到2023 2 26 的数据 xff0c 如果这一天没有数据 xff0c 那就需要往前找 xff0c 直到找不到
  • 关于limit的使用场景

    什么情况下使用 limit 1呢 xff1f 当我们写sql语句的时候需要进行全表扫描 xff0c 前提我们已经确认返回的结果只有一条数据的时候 xff0c 使用limit 1 xff0c 因为使用limit 1 之后 xff0c 在查询过
  • 【STM32多级界面】-LCD结构体多级图形界面框架

    STM32多级界面搭建 在实际的项目之中 xff0c 需要用单片机在LCD OLED中搭建一个3级的图形界面 本文的工程文件我将上次传到百度网盘 xff0c 链接在最后的部分 STM32多级界面搭建一 方案选择二 实现效果三 程序设计3 1
  • ubuntu20.04系统安装u盘制作方法

    1 下载UltraISO软碟通 xff0c 下载Ubuntu20 04 2 打卡UltraISO xff0c 如下 3 加载Ubuntu20 04系统iso文件 文件 gt 打开 xff0c 如下 4 点击 启动 gt 写入硬盘映像 结果如
  • vue和react相同点_我试图在React,Unity,Godot,Construct,Game Maker和Phaser中制作相同的2D游戏原型。 这是我发现的。...

    vue和react相同点 I 39 m a tabletop game developer In designing a new card game I decided to build a digital prototype to hel
  • java发送Http请求(获取响应cookie、重定向)

    1 正常的发送Http请求 xff0c 获取返回值 xff08 json格式 xff09 span class token comment 引入的相关包 import org apache http HttpEntity import or
  • MATLAB基础教程-台大郭彦甫-学习笔记

    MATLAB基础教程 台大郭彦甫 学习笔记 最近在跟着郭彦甫老师的教程学matlab xff0c 刚开始用OneNote整理了一些笔记 郭彦甫老师的课讲的超级棒 xff0c 个人认为目前各平台上最好的matlab入门视频 但是2015年的课
  • MATLAB入门:基本操作与矩阵运算

    matlab基本操作与矩阵运算 基本操作把matlab当作计算器使用变量变量类型避免使用与函数 脚本同名的变量 格式控制 矩阵运算矩阵的定义向量乘法 矩阵索引使用 96 96 创建向量使用 96 96 索引 矩阵串联矩阵运算一些特殊矩阵一些
  • MATLAB数学建模 统计

    统计 叙述统计学数值统计图形统计 推论统计学练习 叙述统计学 数值统计 主要介绍一些函数 M 61 mean A 返回 A 沿大小不等于 1 的第一个数组维度的元素的均值 如果 A 是向量 xff0c 则 mean A 返回元素均值 xff
  • MATLAB数学建模 回归与内插

    以下内容为个人笔记 xff0c 部分图片来源于郭老师课件或课程截图 笔记汇总 xff1a MATLAB基础教程 课程视频 xff1a MATLAB基础教程 台大郭彦甫 xff08 14课全 高清 含课件 xff09 回归与内插 多项式曲线拟
  • [Java] [eclipse] Syntax error on token “;“, , expected 错误

    错误提示 eclipse中遇到如下错误 xff1a 错误代码如下 xff1a 错误原因 类体的内容由两部分构成 xff1a 一部分是变量的声明 xff1b 另一部分是方法的定义 注意在方法外 xff0c 只能有变量的声明 xff0c 不能包
  • MacOS 下基于 Docker 安装 SQL Server

    文章目录 MacOS Docker 安装使用 Homebrew 安装手动下载安装修改镜像加速 安装 SQL Server1 拉取并运行容器镜像2 连接 SQL Server2 2 使用 Navicat 连接 SQL Server 解决 SQ
  • 监督学习-线性回归(数学建模)

    这是在学习吴恩达的机器学习课程时 xff0c 一些随笔 课程地址在 coursera ML 文章目录 监督学习 VS 无监督学习Cost function梯度下降学习率 alpha 多元梯度下降特征缩
  • 吴恩达机器学习 - Coursera Machine Learning(数学建模向)

    这里作为一个目录吧 xff0c 正在学习中 学习过程中做的笔记 xff0c 主要对在数模中比较实用的一些东西做了补充 xff0c 另外就是附上了编程练习的个人解答 希望自己能坚持下去 xff01 监督学习 线性回归 课程原地址在 xff1a
  • win11 安装 WSL2 在非 C 盘及配置(图形界面+代理)

    WSL 安装及配置 直接安装 WSL2 在非 C 盘启用 WSL 功能前提条件设置默认安装 WSL2安装在非 C 盘 图形界面先决条件更新 WSL 以支持 GUI 配置 WSL2 使用 Windows 网络代理 直接安装 WSL2 在非 C
  • ranger 命令_如何使用Ranger从命令行浏览文件

    ranger 命令 Ranger是一种非常方便的基于终端的文件导航器 xff0c 它使用Python编写 xff0c 可用于Linux和Mac Ranger允许您使用键盘上的箭头键浏览文件系统 xff1a 上 下可在当前目录 xff08 中
  • java程序将ftp内文件转为http预览及下载流

    首先引入ftp连接需要的jar包 lt dependency gt lt groupId gt commons net lt groupId gt lt artifactId gt commons net lt artifactId gt

随机推荐

  • 解决 grant all privileges on *.* to ‘root‘@‘%‘ identified by ‘PASSWORD‘ with grant option; 错误

    从MySQL 8开始 xff0c 您不再可以 隐式地 使用GRANT命令创建用户 用CREATE USER代替 xff0c 后面跟着GRANT语句 CREATE USER 39 root 39 64 39 39 IDENTIFIED BY
  • 约瑟夫环问题(菜鸟自己的总结)

    约瑟夫问题 首先约瑟夫问题 据说著名犹太历史学家 Josephus有过以下的故事 xff1a 在罗马人占领乔塔帕特后 xff0c 39 个犹太人与Josephus及他的朋友躲到一个洞中 xff0c 39个犹太人决定宁愿死也不要被敌人抓到 x
  • 模拟电路 电学英语单词大赏

    AC Alternating current 交流电 DC direct current 直流电 op amp operation amplifier 运算放大器 paritical 粒子 electrical potential ener
  • Windows下Seata配置启动

    此为个人笔记 xff0c 看了网上其他人的配置 xff0c 仅仅用于记录 1 首先需要下载安装包与源码 xff0c 俩者版本需一致 https github com seata seata releases 2 创建一个seata 数据库
  • Html技术

    软件架构 xff1a 架构访问端服务端C SClientServerB SBrowserServer Html xff1a Hyper Text Markup Language xff08 超文本标记语言 xff09 简写 xff1a HT
  • Python库的安装问题

    Python库的安装问题 所遇问题与解决方式安装版本 1 Pycharm安装gdal库失败1 1 错误一 xff1a 缺少VC 43 43 14环境1 2 错误二 xff1a 安装VC 43 43 14 0后 xff0c 再在pycharm
  • 转JSON时去除指定属性、JSONArray和JSONObject的顺序变化问题

    一 转JSON时去除指定属性 span class token comment 方法一 xff1a 遍历循环 xff0c 使用remove去除JSON属性 span JSONArray jsonList span class token o
  • java书城登录注册查询 原生servlet实现

    java书城登录注册查询 原生servlet实现 前言一 项目功能二 项目实现方法1 项目结构 总结图片展示结语另外 文章目录 前言一 项目功能二 项目实现方法1 项目结构 总结图片展示结语另外 前言 本人是一位破烂专科的大二学生 xff0
  • shell 美化工具(oh my posh)

    Chat 最近放寒假了 xff0c 这几天在学习小程序与go xff0c 然后经常逛github xff0c 看一些go的项目 xff0c 然后发现一个由go写的项目 xff0c 非常的不错 xff0c 它叫oh my posh xff0c
  • linux twm_回到TWM Linux桌面基础知识

    linux twm TWM是最不起眼的窗口管理器 xff0c 类似于您购买相框时获得的那些样本照片 Xorg随X11 Windows系统一起提供的基本的 xff0c 几乎是最低限度的概念证明 xff0c 可以证明确实可以为图形用户界面 xf
  • sequelize 爬坑【2】 Op 相关操作合集【转】

    const Op span class token operator 61 span Sequelize span class token punctuation span Op span class token punctuation s
  • Spring框架入门

    文章目录 Spring第1章 简介 61 61 1 1 Spring概述 61 61 Spring的下载地址1 3 Spring模块 61 61 Spring框架分为五大模块 xff1a 61 61 1 4 HelloWorld 61 61
  • 小米笔试真题一

    小米笔试真题一 第一题第二题第三题第四题第五题第六题第七题第八题第九题第十题第十一题第十二题第十三题总结 第一题 下述算法的时间复杂度为 xff08 xff09 A O log2n B O n C O nlog2n D O n 2 span
  • C语言数组专题训练

    C语言数组专题训练 第一题第二题第三题第四题第五题第六题第七题第八题第九题第十题第十一题 第一题 若有语句char s1 10 s2 10 61 books xff1b 则能将字符串 books 存放到数组 s1 的正确语句是 A strc
  • 逻辑结构与物理结构

    逻辑结构与物理结构 逻辑结构集合结构线性结构树形结构图形结构 物理结构 逻辑结构 简单的来说 xff0c 逻辑结构就是数据之间的关系 逻辑结构常见有四种类型 xff1a 集合结构 xff0c 线性结构 xff0c 树形结构 xff0c 图形
  • 乐鑫面试流程

    乐鑫面试流程 面试岗位笔试技术面试HR面电话聊天发offer 面试岗位 嵌入式软件实习生 笔试 题目分为选择题和编程题 xff0c 选择题二十题 xff0c 编程题两题 xff1b 选择题基本是一些计算机相关基础知识 xff0c 比较简单
  • 全局变量和静态变量的初始化

    全局变量和静态变量的初始化 全局变量 static变量初始化时间静态局部变量全局变量 不要写出和编译顺序相关的程序总结 全局变量 static变量初始化时间 静态局部变量 首先 xff0c 静态局部变量和全局变量一样 xff0c 数据都存放
  • 不同操作系统及CPU字长、寻址能力、指针宽度的理解

    不同操作系统及CPU字长 寻址能力 指针宽度的理解 字长CPU位宽CPU的寻址能力操作系统32bit 64bit指针大小 字长 64位CPU和32位CPU中64和32的含义 xff1a 64和32指的是CPU中的寄存器 通用 的字长 xff
  • new和malloc的区别

    new和malloc的区别 1 new从自由存储区上分配内存 xff0c malloc从堆上分配内存 自由存储区是C 43 43 基于new操作符的一个抽象概念 xff0c 凡是通过new操作符进行内存申请 xff0c 该内存即为自由存储区
  • 程序中的负数存储及类型转换

    程序中的负数存储及类型转换 负数在计算机中怎样存储什么是原码 反码 补码为什么要设置反码 xff0c 补码剖析本质 C语言数据类型转换 xff08 自动类型转换 43 强制类型转换 xff09 自动类型转换强制类型转换类型转换只是临时性的自