2017-12-28  创建人:Ruo_Xiao
实验环境:vs2010、Intel
邮箱:xclsoftware@163.com
2018-01-16  修改人:Ruo_Xiao添加对移位存储的说明。
2020-11-17  修改人:Ruo_Xiao优化代码格式。

零、基础知识

  1. 原码、反码和补码是计算机存储数字的编码方式(表示方法)。
    拓展:ASCII 码、utf-8 和 utf-16 是计算机存储字符的编码方式。

  2. 原码:符号位+数值的绝对值。
    (1)以 8 位为例,1 的原码为 0000 0001,-1 的原码为 1000 0001。
    (2)取值范围:11111111 ~ 01111111,即:-127 ~ 127。

  3. 反码:正数的反码是原码,负数的反码是在原码的基础上符号位不变,其他位取反的结果。
    以8位为例:1的反码为 0000 0001,-1的反码为 1111 1110。

  4. 补码:正数的补码是原码,负数的补码是在原码的基础上符号位不变,其他位取反再加一,即:反码+1。
    以8位为例:1 的补码为 0000 0001,-1 的补码为 1111 1111。

  5. 补码存在的意义
    (1)1 - 1 = 1 + (-1) = (0000 0001)(原) + (1000 0001)(原) = (1000 0010)(原) = -2。错误
    (2)3 + 5 = (0000 0011)(原) + (0000 0101)(原) = (0000 1000)(原) = 8。正确
    (3)反码相减:3 - 4 = (0000 0011)(原) + (1000 0100)(原) = (0000 0011)(反) + (1111 1011)(反) = (1111 1110)(反) = (1000 0001)(原) = -1。正确
    (4)反码相减:5 - 3 = (0000 0101)(原) + (1000 0011)(原) = (0000 0101)(反) + (1111 1100)(反) + 1(循环进位)= (0000 0010)(反) = (0000 0010)(原) = 2。正确
    (5)1 - 1 = 1 + (-1) = (0000 0001)(反) + (1111 1110)(反) = (1111 1111)(反) = (1000 0000) = -0。
    (6)1 - 1 = (0000 0001)(原) + (1000 0001)(原) = (0000 0001)(补) + (1111 1111)(补)= (0000 0000) (补) = (0000 0000) (原) = 0。
    (7)-1-127 = (1000 0001)(原) + (1111 1111)(原) = (1111 1111)(补) + (1000 0001)(补) = (1000 0000)(补) = -128。

    A、由(1)和(2)可知,原码相加是正确的,但是相减是错误的。
    B、由(3)和(4)可知,反码相加减都是正确的。
    C、但是由(5)可知,1-1 的反码结果为 -0,这个结果在数学上是没有意义的,为了解决这个问题,引入了补码。因为补码是在反码的基础上加 1,故补码的加减是没有问题的,关键是 1-1 了。由(6)可知,补码完美的解决了 1-1 等于 -0 的尴尬局面,直接得到 0 。
    D、由(7)可知,计算机底层算法规定了补码 1000 0000 = -128。这也就导致了补码的取值范围由-127127变为-128127。

  6. 总结:
    (1)由于原码相减结果不对,故使用了反码。但是反码1-1得到的结果是-0,这个在数学上是无意义的,为了导出 1-1=0 的正确结果,故使用了补码,同时规定补码1000 0000 = -128,从而可以将-0表示为 -128,拓展了一个表示位,故8位二进制取值范围为 -128~127 。
    (2)这里再次强调,在计算机中,数据都是以正数的补码的形式存在的。正数的补码是其本身,负数则是以其本身的正数的补码的形式存在的。
    栗子:-123 在计算机中的存储的值是 1111 1011 -> 1000 0100 -> 1000 0101。

一、int

  1. 占用 4 个字节,即:32b,有符号位:从左数第一位。
  2. 取值范围:-2^31 ~ 2^31-1。
    原因:0 代表 +0,-0 代表 -2^31,故负数比整数多一个。
  3. 数据以补码的形式存放在内存中。
  4. 对于 +0 和 -0 在内存中的存储方式。
#include "stdafx.h"
#include <iostream>
using namespace std;int _tmain(int argc, _TCHAR* argv[])
{int i = +0;int k = -0;int *pi = &i;int *pk = &k;char c = '1';char *pc = &c;cout<<"int: "<<sizeof(int)<<" byte"<<endl;cout<<"unsigned int: "<<sizeof(unsigned int)<<" byte"<<endl;cout<<"float: "<<sizeof(float)<<" byte"<<endl;cout<<"double: "<<sizeof(double)<<" byte"<<endl;cout<<"char: "<<sizeof(char)<<" byte"<<endl;cin.get();return 0;
}



二、unsigned int

  1. 占用 4 个字节,即:32b,无符号位。
  2. 取值范围:0 ~ 2^32。
  3. 数据以补码的形式存放在内存中。

三、float

  1. 浮点数在计算机中用科学计数法表示,栗:1.0100011*2^7。
  2. 符号位:“+”或者“-”。
  3. 指数部分:2 的幂指数,栗子中的“7”。
  4. 尾数部分:最高位为“1”的底数,栗子中的“10100011”。
  5. 栗子:15.987 在计算机中存储方式。
    (1)15.987 的整数部分原码:1111。
    (2)15.987 的小数部分原码:11111100……此处省略 11 位。

拓展:小数二进制的计算方法:乘 2 取整,顺序排列。
栗:0.987 的二进制的计算过程如下:0.9872 = 1.974,则第一位为“1”,0.9742 = 1.948,第二位为“1”,0.948*2 = 1.896,,第三位为“1”,依次类推,直至结果的小数为0。当然肯定有无穷尽的,这种情况就是计算机存储浮点数的精度的问题了。所以,只有让整数部分和小数部分的位数和为 24 位(隐藏位技术)即可。此栗中,小数精度为 20 位。
(3)经过上述计算,15.987的二进制为1111.11111100……,用科学计数法表示为1.11111111100……*2^3。
(4)指数部分采用移位存储的方式,即3+(2^7-1) = 130。其二进制:10000010。
(5)尾数部分省略科学计数法的整数部分!!(因为肯定是1)(隐藏位)
(6)15.987在内存中的存放的内容为:
符号位:0(共 1 位)。
指数部分:10000010(共 8 位)。
尾数部分:111111111000……(共 23 位)。
(7)写成完整的二进制:0100 0001 0111 1111 1100 0……
(8)写成16进制:41 7F C……。
(9)因为Intel的架构的字节序是小端序,则真正的存放内容为……C 7F 41。

四、double

原理同上!

五、char

  1. 在内存中以 ASCII 码的形式存储。
  2. 栗子:

代码中字符是“1”,ASCII码为 49,转换为 16 进制为 31。

六、拓展

  1. 移位存储:
    在存储浮点数时,若指数部分若不使用移位存储技术,则会导致 0 有两种表示方式:1000 000 0 和 0000 000 0。所以,为了最大化利用价值,同时保留正负性,在原数据的基础上加 127,其结果如下:
    0000 000 0~0111 111 1代表着-127~0。
    1000 000 0~1111 111 1代表着1~127。
    这样正负指数均可表示的数量保持一致。

(SAW:Game Over!)

int、unsigned int、float、double 和 char 在内存中存储方式相关推荐

  1. C语言中float double等类型在内存中的存储

    问题:十进制数4.5的单精度表示和双精度表示: 备注:   最高位符号位   0表示整数  1表示负数 阶码:  表示的是2的多少次幂这个幂指数 尾数:将其表示成科学计数法之后的舍去科学计数法表示的最 ...

  2. C 语言实例 - 计算 int, float, double 和 char 字节大小

    C 语言实例 - 计算 int, float, double 和 char 字节大小C 语言实例 C 语言实例使用 sizeof 操作符计算int, float, double 和 char四种变量字 ...

  3. C/C++ 各类型int、long、double、char、long long取值范围(基本类型的最大最小值)

    做题的时候经常会使用到数据类型的最大最小值(如int, long, long long, char等),我也查了很多次,这次就记下来当笔记吧. 参考了C++ prime plus.各个博客.教程和c+ ...

  4. char, unsigned char, int,unsigned int之间的相互转换

    char, unsigned char, int,unsigned int之间的相互转换 2018年12月01日 23:45:21 _业精于勤_ 阅读数:667 标签: 数据转换 更多 个人分类: C ...

  5. 华为机试第十五题:HJ15 求int型正整数在内存中存储时1的个数

    华为机试第十五题:HJ15 求int型正整数在内存中存储时1的个数 一.网址链接 二.题目描述 ①描述 ②输入描述 ③输出描述 ④示例一 ⑤示例二 三.代码实现 ①Java代码实现 ②C++代码实现 ...

  6. php实现 求int型数据在内存中存储时1的个数(函数都可自己实现)

    php实现 求int型数据在内存中存储时1的个数(函数都可自己实现) 一.总结 一句话总结:函数我们自己都可以实现,尤其是很多基础函数,没有工具的时候自己写. 1.php进制转换函数? base_co ...

  7. 牛客网——华为机试(题15:求int型正整数在内存中存储时1的个数)(Java)

    题目描述: 输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数. 输入描述: 输入一个整数(int类型) 输出描述: 这个数转换成2进制后,输出1的个数 示例1: 输入: 5 输出: ...

  8. 华为机试——求int型正整数在内存中存储时1的个数

    题目描述 输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数. 输入描述: **输入一个整数(int类型) 输出描述:** 这个数转换成2进制后,输出1的个数 示例1 输入5 输出2 ...

  9. 华为机试HJ15:求int型正整数在内存中存储时1的个数

    作者:Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数. 输入描述: 输入一 ...

最新文章

  1. vista 文件夹提升权限
  2. ] 解决myeclipse中新建javaweb工程,无法使用Web App Libraries问题
  3. PostgreSQL创建数据库时报错:ERROR: source database template1 is being accessed by other users
  4. Application Architecture Guide 2.0 (Chapter 7: Quality Attributes) Part 3
  5. java图像处理之图像裁剪
  6. 博途pcpg接口无法选择_博途TIA功能,如何创建一个S7-1200的项目及硬件组态?
  7. c语言进程间通信架构,构建微服务之:微服务架构中的进程间通信
  8. 万级 K8S 集群背后,etcd 如何保持稳定性?
  9. 智能小车37:异常在ARM、JAVA、硬件里的实现
  10. uboot中的mmc命令
  11. 如何使用Caddy部署Vue项目
  12. 交通监控系统服务器配置,监控系统服务器的配置
  13. 学生信息管理系统(c++源代码实现)
  14. yaw公式_3D 视角旋转矩阵 yaw pitch roll (pan, tilt)的数学计算
  15. php中的gd图像处理,PHP图像处理(GD库)
  16. imagemagick /tmp/magick-xxxxxxxx
  17. Android实现推送PushService通知Notification
  18. 小程序上传图片方法1(免搭建上传到小白接口免费服务器)
  19. OJ之AAABBBCCC与ABCABCABC
  20. 关于WannaCry

热门文章

  1. CentOS 7.0安装Nvidia驱动
  2. 图形化代码阅读工具——Scitools Understand
  3. 文件复制软件绿化之dos命令
  4. DIV CSS兼容性解决IE6/IE7/FF浏览器的通用方法完美兼容
  5. 解秘 Node.js 单线程实现高并发请求原理,以及串联同步执行并发请求的方案
  6. linux fedora安装simplescreenrecorder
  7. cnpm install -g @vue/cli
  8. Django 3.2.5博客开发教程:实现模板之前的分析与准备
  9. 【收藏】mydockfinder下载地址
  10. 开启及关闭go mod