C语言——整形数据的存储
C语言——整形数据的存储
- 前言
- 一、原反补码
- 二、大小端
- 计算机对数据的存储方式可分为大端存储和小端存储模式。
- 三、整形的截断与提升
- 1.整形截断
- 2.整形提升
- 举例说明
前言
C语言中整形数据的存储主要有三个重点。1、原反补码 2、大小端 3、整形截断和提升
一、原反补码
原码、反码、补码是计算机中对数字的二进制表示方法。
原码:将最高位作为符号位(0表示正,1表示负),其它数字位代表数值本身的绝对值的数字表示方式。
反码:如果是正数,则表示方法和原码一样;如果是负数,符号位不变,其余各位取反,则得到这个数字的反码表示形式。
补码:如果是正数,则表示方法和原码一样;如果是负数,则将数字的反码加上1(相当于将原码数值位取反然后在最低位加1 。
用八位二进制数举个例子:
原码 | 反码 | 补码 | |
---|---|---|---|
1 | 00000001 | 00000001 | 00000001 |
-1 | 10000001 | 11111110 | 11111111 |
那么为什么会有原反补码存在呢? 原因是计算机只有加法器,没有减法器。
在计算器中,所有的减法计算都必须用加法进行,通过被减数的补码代替被减数,可以把减法转变为加法运算。
用上例中的两数相加试一试。
如果用原码计算:
可以看到答案是-2,但这并不是正确的结果,因此聪明的计算机先驱们创造了补码,利用补码相加:
这样一来,计算的答案就正确了!
二、大小端
计算机对数据的存储方式可分为大端存储和小端存储模式。
采用大小模式对数据进行存放的主要区别在于在存放的字节顺序,大端方式将高位存放在低地址,小端方式将低位存放在低地址。采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。到目前为止,采用大端或者小端进行数据存放,其孰优孰劣也没有定论。
在一个处理器系统中,有可能存在大端和小端模式同时存在的现象。这一现象为系统的软硬件设计带来了不小的麻烦,因此,判断系统到底是大端还是小段存储是非常终于重要的。
设计一个函数判断大小端:
代码一:
void bigorsmall()
{int a = 1;
char b = *(char*)&a;
if(b==1)printf("小端\n")
elseprintf("大端\n");
}
代码二(利用联合体判断):int bigorsmall()
{union{ int i;char c;}un;un.i = 1;return un.c;
}
如果返回1,则说明是小端机,0则是大端机。
三、整形的截断与提升
整形的截断和提升是给整形赋值时可能会发生的事件。
1.整形截断
机制 | 将字节数多的数据类型赋给字节数少的数据类型时触发 |
---|---|
效果 | 截取低位的数据,舍弃高位数据 |
2.整形提升
机制 | 将字节数少的数据类型赋给字节数多的数据类型时触发 |
---|---|
效果 | 1.无符号数->向多出的高位补0 ----------------- 2.有符号数->补符号位 |
举例说明
整形截断
int main()
{unsigned char a = 200;unsigned char b = 100;unsigned char c = 0;c = a + b;printf(“%d ”, c);return 0;
}
上面代码的输出结果是44。原因是由于200+100=300,但无符号char型的最大值是255,300的二进制数是100101100此时传值就会发生截断,舍弃最高位的1,剩下的低八位就是44了。
整形提升int main() { char a = -128; printf("%u\n",a); return 0;
}
上面代码的输出结果如下
这里为什么会输出一个这么大的数字呢,我们把它转换成二进制看看,转换成二进制的结果是11111111 11111111 11111111 10000000,可以看到前面那么多1的原因应该是进行了补位。
这就是整形提升的效果,来分析一下这段代码。
这里给a赋值的第一步首先进行了整形截断,-128的二进制是110000000,补码是110000000,截断后变成10000000(8位二进制数)。
然后需要%u打印时就要进行整形提升到32位,补充符号位后就变成了11111111 11111111 11111111 10000000,因此就能理解输出结果为什么这样了。
C语言——整形数据的存储相关推荐
- 关于c语言中数据的存储
数据的存储首先就要说到数据的类型,类型决定了看待内存空间的视角. c语言的数据类型分为内置类型和外置类型 1.内置类型 (1)整型 char(字符型).short(短整型).int(整型).long( ...
- C语言整形数据的负数是如何存储的?
在C语言中,整型数据类型通常使用补码表示法来存储负数. 补码表示法是将负数的二进制数按位取反(即0变为1,1变为0),再加1得到的结果. 例如,假设一个无符号8位二进制数01011001表示数值89, ...
- 【濡白的C语言】数据的存储(大小端模式,原码反码补码,浮点数的存储,浮点型精度缺失的原因)
前言 很多学习C语言之后就会对各种类型感到很烦,但是数据的类型具有相当的意义.首先是类型决定了大小,即该数据在内存中开辟的空间大小:同时不同的类型还决定了数据存储的方式,相同的数据,存入整形与浮点型方 ...
- c51语言中数据的存储类型,C51-数据存储类型
KEILCx51是面向8051系列单片机及其硬件控制系统的开发工具.它定义的任何数据类型必须以一定的存储类型的方式定位在8051的存储区中,否则便没有任何的实际意义.该编译器通过将变量.常量定义成不同 ...
- c语言中静态存储类别是,小议C语言中数据的存储类型
C语言中的一些说明和定义会用到存储类型这样一个概念,在C语言中存储类型会用到下述几个关键字:auto,static,register,extern. 看下面的简略图大家可以明确程序在进行存储时是分为三 ...
- C语言_数据的存储_作业
1.原码.反码.补码说法错误的是( ) A.一个数的原码是这个数直接转换成二进制 B.反码是原码的二进制符号位不变,其他位按位取反 C.补码是反码的二进制加1 D.原码.反码.补码的最高位是0表示负数 ...
- 【C语言】数据的存储——M,E
目录 1.数据类型介绍 2.大小端介绍 //设计一个小程序判断当前机器的大小端 3.浮点型存储 3.1浮点数存储规则 3.2M和E的存储 3.3解释例子 1.数据类型介绍 整形:char.short. ...
- C语言中数据在内存中的存储
要想了解数据在内存中的存储的话,首先应该了解数据的类型. 下面介绍C语言中数据类型: 1.C语言中的基本内置类型: char //字符数据类型 大小为1个字节 short //短整型 大小为2个字节 ...
- c语言字母是怎么存储,C语言之数据在内存中的存储
C语言之数据在内存中的存储 在我们学习此之前,我们先来回忆一下C语言中都有哪些数据类型呢? 首先我们来看看C语言中的基本的内置类型: char //字符数据类型 short //短整型 int //整 ...
最新文章
- 《机器学习思维导图》,一图掌握机器学习知识要点
- FFmpeg将Jpeg 编码到视频中
- 96. 奇怪的汉诺塔【递推】
- 关于答题抢票活动中奖率低的说明 |程序员光荣日
- python3 for sum_Python for循环和“sum13”方法
- rabbitmq异步_在Node.js中使用RabbitMQ和Tortoise进行异步消息传递
- Spring MVC表单实例
- 数据库系列学习(三)-数据的增、删、改
- atitit.thumb生成高质量缩略图 php .net c++ java
- android 手机 基站定位软件,安卓手机基站+GPS定位源码
- 微型计算机原理与应用实验指导书,微型计算机技术与应用实验指导书.doc
- robotium和appium的一些区别(转)
- c语言链表详解(超详细)
- 作文 我眼中的计算机1000字,我眼中的自己作文范文1000字(精选6篇)
- [嵌入式开发模块]SHT30/20 温湿度传感器 驱动模块
- HCIA网络课程第一周作业
- 单点登录(4):单点登录实现(附源码)
- Seata分布式事务控制整合Mybatis-Plus导致事务控制失效
- 培训班出身的前端,出路在哪儿?
- 2019年云计算产业市场前景研究,云计算技术发展趋势
热门文章
- 斐波那契问题的递归和动态规划
- osmnx 笔记: plot_graph_route plot_graph_routes
- 全国大学生数学建模如何轻松获得一等奖,我想你需要知道这样知识
- 深度学习核心技术精讲100篇(二十二)-深度解析数学建模核心知识之搜索与推荐模型中用户建模原理
- 肤色检测算法 - 基于二次多项式混合模型的肤色检测
- 深度学习100例 | 第28天:水果的识别与分类(准确率99.9%)
- LeetCode-数学-9. 回文数
- 【LeetCode从零单排】No19.RemoveNthNodeFromEndofList
- qconshanghai2014
- Inversion of Control Containers and the Dependency Injection pattern--Martin Fowler