【408篇】C语言笔记-第二十章(数据的机器级表示)

news2024/11/15 11:28:55

文章目录

    • 第一节:补码讲解及内存实战演练
      • 1. 补码讲解
      • 2. 反码
    • 第二节:整型不同类型解析-溢出解析
      • 1. 整型不同类型解析
      • 2. 溢出解析
    • 第三节:IEEE754标准解析
    • 第四节:浮点型精度丢失

第一节:补码讲解及内存实战演练

1. 补码讲解

计算机的CPU无法做减法操作,只能做加法操作。CPU中有一个逻辑单元叫加法器。

计算机所做的减法,都是通过加法器将其变化成加法实现的

小端存储:X86架构都是使用的小端存储。小端存储是低字节在前,即低字节在低地址。高字节在后,即高字节在高地址,fb对于0xffffffffb是低字节,因此fb在内存中最前面。大端和小端相反。

负数在内存中以补码的形式存储。

问题:如何实现2-5?

实现2-5的方法是2+(-5),由于计算机只能存储0和1,5的二进制数为101,称为原码。计算机用补码表示-5,补码是对原码取反后加1的结果。

如上图:-5在内存中存储为0xfffffffb,对其加2后得0xfffffffd它就是k的值。当最高位为1时表示负数。我们在通过取反加1得到原码,也就是3,由于是负数,所以就是-3。

说明:补码得原码的时候先取反再加1先减1再取反效果一样。

注意:通过8位表示,-5的补码为1111 1011,-5的原码为10000 0101,符号位不动的,只有值的部分是5。

2. 反码

反码是一种在计算机中数的机器码表示。对于单个数值(二进制的0和1)而言,对其进行取反操作就是将0变成1,1变成0,正数的反码和原码一样,负数的反码就是在原码的基础上符号位保持不变,其他位取反。

第二节:整型不同类型解析-溢出解析

1. 整型不同类型解析

整型变量包括6中类型。有符号与无符号整型的最高位代表的意义不同。

不同整型变量表示的整型范围如表所示,超出范围会发生溢出现象,导致计算出错。

2. 溢出解析

有符号短整型可以表示的最大值为32767,当我们对其加1时,b的值会变成多少呢?实际运行打印得到的是-32768,为什么会这样呢?因为32767对应的十六进制数为0x7fff,加1后变为0x8000,其首位为1,因此变成了一个负数,去这个负数的原码后,就是其本身,值为32768,所以0x8000是最小的负数,即-32768,因此导致计算结果出错。

#include <stdio.h>

int main() {
    int i=10;
    short a=32767;
    short b=0;
    long c;
    b=a+1; // 发生了溢出,解决溢出的办法是用更大的空间来存
    printf("b=%d\n",b);  // b并不是32767
    printf("---------------\n");
    unsigned int m=3;
    unsigned short n=0x8056; // 无符号类型,最高位不认为是符号位
    unsigned long k=5;
    b=0x8056;
    printf("b=%d\n",b); // b是有符号类型,所以输出是负值
    printf("n=%u\n",n); // 无符号类型要用%u,用%d是不规范的
    return 0;
}
F:\Computer\Project\practice\20\20.4-overflow\cmake-build-debug\20_4_overflow.exe
b=-32768
---------------
b=-32682
n=32854

进程已结束,退出代码为 0

第三节:IEEE754标准解析

float型变量占用的内存空间为4字节,double型变量占用的内存空间为8字节。

与整型数据的存储方式不同,浮点型数据是按照指数形式存储的。系统把一个浮点型数据分成小数部分(用M表示)和指数部分(用E表示)并分别存放,指数部分采用规范化的指数形式,指数也分为正、负(符号位,用S表示)。

数符(即符号位)占1位,是0时代表正数,是1时代表负数。

4.5的IEEE-754浮点型变量存储标准

格式SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM
二进制0100 00001001 00000000 00000000 0000
十六进制40900000

S:S是符号位,用来表示正、负,是1表示负数,是0表示正数。

E:E代表指数部分(指数部分的值规定只能是1到254,不能全是0或全是1),指数部分运算前都要减去127,因为还要表示负指数。这里的10000001转换为十进制数为129,129-127=2,即实际指数部分为2.

M:M代表小数部分,这里为0010 0000 0000 0000 0000 000,底数左边省略存储了一个1,使用的实际底数表示为1.00100000000000000000000。

上面表1可以变为如下表格:

S(符号位)E(阶码)M(尾数)
01000 00010010 0000 0000 0000 0000 000

可以看到,4.5的内存是0x40900000。

首先看f的小数部分,也就是表中M(灰色)的部分。这里为0010 0000 0000 0000 0000 000.总计23位。由于底数左边省略存储了一个1,所以实际底数部分表示为1.00100000000000000000000。

在看指数部分,计算机并不能直接计算10的幂次,f的指数部分为1000 0001,其十进制值为129,129-127=2,即实际指数部分为2,指数值为2,代表2的2次幂。因此将1.001左移2位即可,也就是100.1,然后转换成十进制数,整数部分为4,小数部分为2的-1次方,为0.5,因此十进制数为4.5。

1.456的内存为0x355eba3f。

首先看f1的小数部分,是表中Mhuise代表的部分,这里为011 1010 0101 1110 0011 0101,总计23位。底数左边省略存储了一个1,实际底数表示为1.011 1010 0101 1110 0011 0101。

指数部分:计算机不能直接计算10的幂次,f1的指数部分为0111 1111,其十进制为127,127-127=0,即实际指数部分为0指数,代表2的0次幂,为1。因为1.011 1010 0101 1110 0011 0101无需做移动。

1+0.25+0.125+0.0625+0.015625=1.453125。

第四节:浮点型精度丢失

浮点型变量分为单精度(float)型,双精度(double)型。

浮点型使用的是指数表示法,需要记忆数值范围。

表中的double类型是-1022到1023,是通过1-2046(不能全是0或全是1,全1是2047)减去1023,得到-1022到1023。

#include <stdio.h>

// 提醒:scanf读取double类型是,要用lf,如double d;scanf("%lf",&d);
int main() {
    float a=1.23456789e10;
    float b;
    b=a+20;  // 计算时精度丢失
    printf("b=%f\n",b); // %f既可以输出float,也可以输出double类型
    return 0;
}
F:\Computer\Project\practice\20\20.6-double\cmake-build-debug\20_6_double.exe
b=12345678848.000000

进程已结束,退出代码为 0

分析:对于程序中,我们赋给a的值为1.23456789e10,加20后,应该得到的值是1.234567892e10,但b输出的结果却是b=12345678848.000000,变得更小了。我们将这种现象称为精度丢失,因为float类型数据能够表示的有效数字为7位,最多只保证1.234567e10的正确性。要使结果正确,就需要把a和b均改为double类型,因为double可以表示的精度为15-16位

注意:对于强制类型转换,int转float可能造成精度丢失,因为int是有10位有效数字的,但是int强制转为double不会,float转为double也不会丢失精度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/131271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用华为云服务器跟做尚硅谷电商数仓遇到的问题汇总(持续更新中.......)

文章目录使用xsync时提示xsync:command not found执行lg.sh时显示lg.sh:command not found云服务器网页无法访问hadoop使用xsync时提示xsync:command not found 1.使用xsync时提示xsync:command not found 首先查看是否安装rsync:&#xff08;反正我的里面没有。。。&#xff…

实验十、差分放大电路参数对静态和动态的影响

一、题目 利用Multism研究图1所示差分放大电路在下列情况下对电路静态和动态的影响 &#xff08;1&#xff09;两个 RcR_cRc​ 阻值相差 5%&#xff1b; &#xff08;2&#xff09;RwR_wRw​ 不在中点&#xff1b; &#xff08;3&#xff09;两个差分管的电流放大倍数不相等。…

sql行转列

我们以MySQL数据库为例&#xff0c;来说明行转列的实现方式。 首先&#xff0c;假设我们有一张分数表&#xff08;tb_score&#xff09;&#xff0c;表中的数据如下图&#xff1a; 然后&#xff0c;我们再来看一下转换之后需要得到的结果&#xff0c;如下图&#xff1a; 可以看…

SpringBoot(一)【学习笔记】

1.SpringBoot是什么&#xff1f; Spring Boot是为了简化Spring应用的创建、运行、调试、部署等而出现的&#xff0c;使用它可以做到专注于Spring应用的开发&#xff0c;而无需过多关注XML的配置。 2.SpringBoot的特点 为基于Spring的开发提供更快的入门体验 开箱即用&#xf…

Qt QAbstractItemModel类详解

文章目录一.概述二.QAbstractItemModel类1.类型2.信号3.函数一.概述 QAbstractItemModel 类定义了项目模型必须使用的标准接口&#xff0c;以便能够与模型/视图Model/View框架中的其他组件进行互操作。 正确用法是将其子类化以创建新模型。此类用作 QML 中的项目视图元素或 Qt…

自制Alfred/Wox插件推荐

最近上手Alfred的使用&#xff0c;日常工作中存在很多需要高频执行的连续性动作&#xff0c;将这一系列动作封装成Workflow&#xff0c;通过命令触发&#xff0c;对提升效率确有很大帮助。 自己封装了一些简单的Workflow&#xff0c;这里分享出来。有Alfred/Wox框架的支撑&…

JAVA零基础小白学习免费教程day14-SetHashMap

day14_JAVAOOP 课程目标 1. 【理解】Set集合的特点 2. 【理解】Set集合不重复的原理 3. 【掌握】HaseSet集合的基本使用 4. 【理解】LinkedHashSet的特点 5. 【理解】Map集合的特点 6. 【掌握】HashMap的使用 7. 【理解】LinkedHashMap的特点 8. 【掌握】Map集合的案例 9. 【…

doxygen教程之注释风格

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> doxygen是一个开源的C接口文档生成工具。要使用doxygen生成接口文档&#xff0c;就必须遵循它的注释规范&#xff0c;下面对它的注释规范进行简单介绍。 …

C语言基础--初识指针

文章目录一、初识指针二、指针和指针类型指针类型的意义1&#xff09;指针的解引用①问题抛出②探讨③总结2&#xff09;指针整数3&#xff09;总结4)举例三、野指针&#xff08;1&#xff09;概念1) 指针未初始化2)指针越界访问3&#xff09;指针指向的空间释放&#xff08;2&…

python类中常见内置方法

目录 一.几种常用的类内置方法 魔术方法 _ _str_ _字符串方法 _ _lt_ _小于符号比较方法 _ _le_ _小于等于比较符号方法 _ _eq_ _等于比较符号 一.几种常用的类内置方法 魔术方法 上文提到的_ _init_ _构造方法&#xff0c;是Python类内置的方法之一。 这些内置的类方法…

人工智能-聚类算法

1、聚类算法简介 典型的无监督算法&#xff0c;主要用于将相似的样本自动归到一个类别中。 根据样本之间的相似性&#xff0c;将样本划分到不同的类别中&#xff0c;对于不同的相似度计算方法&#xff0c;会得到不同的聚类结果。常用的相似度计算方法是欧式距离法 聚类算法与…

2022年总结 2023展望

前言 今天是2022年最后一天&#xff0c;姑且简单总结这一年。这一年从头到尾发生了很多翻天覆地的事件。回看去年2021年的年度总结还是有些遗憾&#xff0c;完成度4/7。 回顾 2021 年立下的 flag&#xff1a; 写文章30篇 没有完成&#xff0c;技术和知识是在有断断续续学习&a…

【Linux】多线程

目录 一、什么是线程 1、线程的基本认识 2、Linux线程与接口关系的认识 3、创建线程 4、线程等待 5、线程终止 6、线程分离 二、线程的优点 三、线程的缺点 四、线程与进程的关系 1、线程安全与重入 2、不可重入情况 3、可重入情况 4、可重入与线程安全的联系 五…

算法合集 —— 数组篇

算法 —— 数组 目录算法 —— 数组1.二分查找1.1二分查找习题集2.双指针法2.1双指针法习题集3.滑动窗口3.1滑动窗口习题集4.二维数组4.1二维数组习题集1.二分查找 二分查找适用于&#xff0c;在有序排列的数组中查找某一指定元素。 其原理为范围搜索&#xff1a;如果这个元素…

opencv-python常用函数解析及参数介绍(四)——图像阈值

图像阈值处理前言1.改变图像颜色灰度图HSV图2.图像阈值图像中数值对应的效果函数与参数阈值处理效果前言 在很多任务当中&#xff0c;首要的任务就是对图像进行阈值处理&#xff0c;为后续其他操作做准备&#xff0c;本文将介绍5种阈值处理的方法以及参数设置&#xff0c;同时…

API 概述

API 概述目录概述需求&#xff1a;设计思路实现思路分析1.High-Level API &#xff1a;用于事务边界定义、控制及事务状态查询。2.2. High-Level API5.2.2 GlobalTransactionContextTransactionalTemplateLow-Level API参考资料和推荐阅读Survive by day and develop by night.…

网络协议总结

网络协议总结网络模型网络协议TCP/IP 模型网络接入层封装与解封装实际数据传输举例发送数据包接收数据包网络接口处理IP 模块处理TCP 模块处理应用程序处理网络构成通信介质与数据链路网卡二层交换机路由器 / 三层交换机![在这里插入图片描述](https://img-blog.csdnimg.cn/a8e…

F280049C General-Purpose Input/Out(GPIO)

​ 文章目录GPIO8.1 简介8.2 配置概述8.3 ADC引脚上的数字输入&#xff08;AIO&#xff09;8.4 数字通用I/O控制8.5 输入限定8.5.1 异步输入8.5.2 仅与SYSCLKOUT同步8.5.3 使用采样窗口进行鉴定8.6 SPI信号8.7GPIO和外设引脚复用8.7.1GPIO复用8.7.2 外设复用8.8 内部上拉配置要…

基础架构:一条SQL查询语句是如何执行的?

这是专栏的第一篇文章,我想来跟你聊聊 MySQL 的基础架构。我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于 MySQL 的学习也是这样。平时我们使用数据库,看到的通常都是一个整体。比如,你有个最简单的表,表…

DML语句

DML语句目录概述需求&#xff1a;设计思路实现思路分析1.SQL 实例2.UPDATE3.DELETE4.SELECT5.是TRUNCATE参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wai…