关键字unsigned和signed

数据在计算机中的存储
  • 任何数据在计算机中都必须被转化成二进制,因为计算机只认识二进制.而计算机还要区分数据是正数还是负数,则二进制又分为符号位 + 数据位.
  • 计算机内存储的整型必须是补码
  • 无符号数和正数的原反补码相等,直接存入计算机中.负数需要将原码转化成补码再存储
  • 类型决定了如何解释空间内部保存的二进制序列
  • 浮点数默认是double类型,如果想要float需要在数后加上f,如float f = 1.1f;
原码 与 补码的转化与硬件关系
例: int b = -20; //20 = 16+4 = 2^4^ (10000)~2~+ 2^2^(100)~2~
//有符号数且负数 原码转成补码:
1000 0000 0000 0000 0000 0000 0001 0100 原码
1111 1111 1111 1111 1111 1111 1111 1011 反码 = 原码取反
1111 1111 1111 1111 1111 1111 1111 1100 补码 = 反码+1 //补码转原码
方法一: 原理
1111 1111 1111 1111 1111 1111 1111 1100 补码
1111 1111 1111 1111 1111 1111 1111 1011 反码 = 补码-1
1000 0000 0000 0000 0000 0000 0001 0100 原码 = 反码取反 方法二: 计算机硬件使用的方式, 可以使用一条硬件电路,完成原码补码互转
1111 1111 1111 1111 1111 1111 1111 1100 补码
1000 0000 0000 0000 0000 0000 0000 0011 补码取反
1000 0000 0000 0000 0000 0000 0000 0100 +1
原理:补码 = 模-原码 <=> 原码 = 模-补码 <=> 补码取反+1
原,反,补的原理:

原反补的概念从时钟引入, 8点+2 = 10点. 而8点-10也等于10点.即2是-10以12为模的补码.

-10要转化成2 ,可以用模-10来得到,但硬件中位数是固定的,模数为1000...,最高位会溢出舍弃.即全0.无法做差.

引入反码转换计算:即2 == 模-10 == 模-1+1-10 == 1111... -10 +1 == 反码+1; 这个111...-10就是反码,即反码+1==补码的由来

在二进制中,全1减任何数都是直接去掉对应的1.所以反码就是原码符号位不变,其余位全部取反

转换成补码后,底层就不需要再考虑符号位,等运算完后再看符号位.

整型存储的本质

定义unsigned int b = -10; 能否正确运行? 答案是可以的.

定义的过程是开辟空间,而空间只能存储二进制,并不关心数据的内容

数据要存储到空间里,必须先转成二进制补码.而在写入空间时,数据已经转化成补码

变量存取的过程
  • 存: 字面数据必须先转成补码,再放入空间中.符号位只看数据本身是否携带+-号,和变量是否有符号无关.
  • 取: 取数据一定要先看变量本身类型,然后才决定要不要看最高符号位.如果不需要,则直接将二进制转成十进制.如果需要,则需要转成原码,然后才能识别(还需要考虑最高符号位在哪里,考虑大小端)
类型目前的作用
  1. 存数据前决定开辟多大的空间
  2. 读数据时如何解释二进制数据

特定数据类型能表示多少个数据,取决于自己所有比特位排列组合的个数

十进制与二进制快速转换
(前置知识:需要熟记2^0到2^10的十进制结果)
1 -> 2^0
10 -> 2^1
100 -> 2^2
1000 -> 2^3 //1后面跟3个比特位就是2^3
规律: 1后n个0就是2^n,即n等于几1后面就跟几个0 --- 十进制转二进制
反过来就是1后面跟几个0,就是2的几次方 --- 二进制转十进制
因此:2^9 -> 10 0000 0000 // n 例: 67 = 64+2+1 -> 2^6+2^1+2^0 -> 1000000 + 10 + 1
= 0000 0000 .... 0100 0011
同理,二进制转十进制逆过程即可
大小端字节序

现象: vs的内存窗口中,地址从上到下依次增大,从左到右也依次增大

  1. 大端:按照字节为单位,低权值位数据存储在高地址处,就叫做大端
  2. 小段:按照字节为单位,低权值位数据存储在低地址处,就叫做小端(小小小)

(基本上以小端为主,大端比较少(网络))

大小端存储方案,本质是数据和空间按照字节为单位的一种映射关系

(考虑大小端问题是1字节以上的类型.short,int,double...)

判断当前机器的字节序
  • 方法1: 对int a = 1 取首地址,然后(char*)&a,得到的值是1则为小端,否则为大端
  • 方法2: 打开内存窗口查看地址与数据的字节序
"负零"(-128)的理解
(负零的概念并不存在,只是碰巧相像)
-128实际存入到计算机中是以 1 1000 0000 表示的(计组运算器).但空间只有8位,发生截断,因此得到1000 0000.
而[1111 1111,1000 0001]~[0000 0000,0111 1111]
即[-127,-1]~[0,127] 自然数都已经被使用 .
计算机不能浪费每一个空间(最小的成本尽可能解决大量的计算),自然1000 0000也需要有相应的意义. 因此赋予数值为-128. 因为截断后也不可能恢复,所以这是一种半计算半规定的做法.

截断

截断是空间不足以存放数据时,将高位截断.

截断的是高位还是低位? 因为赋值永远都是从低地址赋起(从低到高依次赋值),因此空间不足时高位直接丢弃.

注意:表达式计算时进位产生的溢出不是截断,进位是会保存在相关寄存器中的.只有将结果保存在变量时,因为溢出,放不下,只能舍弃一部分数据,此时才发生截断.

1 0000 0001 0100

1 1111 1110 1100

0 0000 0000 1010

1 1111 1111 0110

1 0000 0000 1010

建议在无符号类型的数值后带上u,

默认的数值是有符号的,在数值后加u更加严格,可读性更好,unsigned int a = 10u;

sign与unsigned的原理、数据存储与硬件的关系的更多相关文章

  1. 数据存储单位的换算关系(TB、PB、EB、ZB、YB)

  2. 整型变量修饰符,char类型数据存储原理,字节数,

    //------------------整型变量修饰符 修饰符(int short long longlong signed unsigned)所有修饰符都是用来修整形 int 4short %hd ...

  3. zookeeper原理解析-数据存储

    Zookeeper内存结构 Zookeeper是怎么存储数据的,什么机制保证集群中数据是一致性,在网络异常,当机以及停电等异常情况下恢复数据的,我们知道数据库给我们提供了这些功能,其实zookeepe ...

  4. 深度剖析HashMap的数据存储实现原理(看完必懂篇)

    深度剖析HashMap的数据存储实现原理(看完必懂篇) 具体的原理分析可以参考一下两篇文章,有透彻的分析! 参考资料: 1. https://www.jianshu.com/p/17177c12f84 ...

  5. [转帖]Git数据存储的原理浅析

    Git数据存储的原理浅析 https://segmentfault.com/a/1190000016320008   写作背景 进来在闲暇的时间里在看一些关系P2P网络的拓扑发现的内容,重点关注了Ma ...

  6. 重新学习MySQL数据库3:Mysql存储引擎与数据存储原理

    重新学习Mysql数据库3:Mysql存储引擎与数据存储原理 数据库的定义 很多开发者在最开始时其实都对数据库有一个比较模糊的认识,觉得数据库就是一堆数据的集合,但是实际却比这复杂的多,数据库领域中有 ...

  7. ValueStack和OGNL达到Struts2形式的数据存储原理

    (1)最近学习struts相框,我们在快乐struts强大.为了便于使用转发,但不了解详细的内部数据存储: (2)网上找了很多关于struts数据存储的原理,但我还没有找到一个具体的解释,本书上找到了 ...

  8. Kafka数据安全性、运行原理、存储

    直接贴面试题: 怎么保证数据 kafka 里的数据安全? 答: 生产者数据的不丢失kafka 的 ack 机制: 在 kafka 发送数据的时候,每次发送消息都会有一个确认反馈机制,确保消息正常的能够 ...

  9. kafka 数据存储结构+原理+基本操作命令

    数据存储结构: Kafka中的Message是以topic为基本单位组织的,不同的topic之间是相互独立的.每个topic又可以分成几个不同的partition(每个topic有几个partitio ...

  10. Android数据存储原理分析

    Android上常见的数据存储方式为: SharedPreferences是 Android 中比较常用的存储方法,本篇将从源码角度带大家分析一下Android中常用的轻量级数据存储工具SharedP ...

随机推荐

  1. 女朋友问我 LB 是谁?

    科普一下 LB(负载均衡)技术 我的编程导航网站:www.code-nav.cn 大家好,我是鱼皮. 周末在家写代码,无意中跟女朋友提了下 LB,还说 LB 好的呱呱叫. 她笑了笑,问我 LB 是谁? ...

  2. [oeasy]python024_vim读取文件_从头复制到尾_撤销_重做_reg_寄存器

    Guido的简历 回忆上次内容 python 是Guido制作的语言 从Guido刚入职场 就开始的项目 python这个项目 一直跟随Guido   Guido 曾经在 cwi cnri beope ...

  3. [oeasy]python0002_终端_CLI_GUI_编程环境_游戏_真实_元宇宙 🥊

    回忆   上次 了解了 python 语言的特点 历史悠久 功能强大 深受好评 已成趋势   3大主流操作系统 mac windows linux             添加图片注释,不超过 140 ...

  4. MySQL之DML

    DQL:SELECT * FROM 表名 DML(数据操作语言,它是对表记录的操作(增.删.改)!) 1. 插入数据 * INSERT INTO 表名(列名1,列名2, ...) VALUES(列值1 ...

  5. Django模型中的save方法 精讲

    两种方法定义在Django模型中的save方法有不同的参数处理方式. 第一种方法: def save(self, *args, **kwargs): super().save(*args, **kwa ...

  6. 【FastDFS】05 Java程序测试上传

    创建普通Maven工程 导入所需依赖坐标: <dependencies> <!-- https://mvnrepository.com/artifact/net.oschina.zc ...

  7. 人形机器人(humanoid)(双足机器人、四足机器人)—— 操控员 —— 机器人数据收集操作员

    参考: https://www.youtube.com/watch?v=jbQ4M4SNb2M 机器人数据收集操控员,就和大模型训练数据收集员.数据类型标识员(打标签人员)一样,都是为了人工生成AI训 ...

  8. 【转载】 tensorflow: 怎样找到对应的bazel 版本和安装

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/u011279649/article/de ...

  9. Temperature 题解

    前言 题目链接:洛谷:SPOJ:Hydro & bzoj. 题意简述 有一个长度为 \(n\) 的序列,每个位置值的范围为 \([L_i, R_i]\) 内,求原序列可能的最长不降子串长度. ...

  10. 三台服务器上离线安装redis哨兵集群,一主二从三哨兵

    三台服务器上离线安装redis哨兵集群,一主二从三哨兵 系统安装好gcc环境,(不然编译redis会报错).依旧不知道怎么离线安装gcc环境的可查看CentOS下离线安装gcc环境,图文详细 下载 点 ...