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语言——整形数据的存储相关推荐

  1. 关于c语言中数据的存储

    数据的存储首先就要说到数据的类型,类型决定了看待内存空间的视角. c语言的数据类型分为内置类型和外置类型 1.内置类型 (1)整型 char(字符型).short(短整型).int(整型).long( ...

  2. C语言整形数据的负数是如何存储的?

    在C语言中,整型数据类型通常使用补码表示法来存储负数. 补码表示法是将负数的二进制数按位取反(即0变为1,1变为0),再加1得到的结果. 例如,假设一个无符号8位二进制数01011001表示数值89, ...

  3. 【濡白的C语言】数据的存储(大小端模式,原码反码补码,浮点数的存储,浮点型精度缺失的原因)

    前言 很多学习C语言之后就会对各种类型感到很烦,但是数据的类型具有相当的意义.首先是类型决定了大小,即该数据在内存中开辟的空间大小:同时不同的类型还决定了数据存储的方式,相同的数据,存入整形与浮点型方 ...

  4. c51语言中数据的存储类型,C51-数据存储类型

    KEILCx51是面向8051系列单片机及其硬件控制系统的开发工具.它定义的任何数据类型必须以一定的存储类型的方式定位在8051的存储区中,否则便没有任何的实际意义.该编译器通过将变量.常量定义成不同 ...

  5. c语言中静态存储类别是,小议C语言中数据的存储类型

    C语言中的一些说明和定义会用到存储类型这样一个概念,在C语言中存储类型会用到下述几个关键字:auto,static,register,extern. 看下面的简略图大家可以明确程序在进行存储时是分为三 ...

  6. C语言_数据的存储_作业

    1.原码.反码.补码说法错误的是( ) A.一个数的原码是这个数直接转换成二进制 B.反码是原码的二进制符号位不变,其他位按位取反 C.补码是反码的二进制加1 D.原码.反码.补码的最高位是0表示负数 ...

  7. 【C语言】数据的存储——M,E

    目录 1.数据类型介绍 2.大小端介绍 //设计一个小程序判断当前机器的大小端 3.浮点型存储 3.1浮点数存储规则 3.2M和E的存储 3.3解释例子 1.数据类型介绍 整形:char.short. ...

  8. C语言中数据在内存中的存储

    要想了解数据在内存中的存储的话,首先应该了解数据的类型. 下面介绍C语言中数据类型: 1.C语言中的基本内置类型: char //字符数据类型 大小为1个字节 short //短整型 大小为2个字节 ...

  9. c语言字母是怎么存储,C语言之数据在内存中的存储

    C语言之数据在内存中的存储 在我们学习此之前,我们先来回忆一下C语言中都有哪些数据类型呢? 首先我们来看看C语言中的基本的内置类型: char //字符数据类型 short //短整型 int //整 ...

最新文章

  1. 《机器学习思维导图》,一图掌握机器学习知识要点
  2. FFmpeg将Jpeg 编码到视频中
  3. 96. 奇怪的汉诺塔【递推】
  4. 关于答题抢票活动中奖率低的说明 |程序员光荣日
  5. python3 for sum_Python for循环和“sum13”方法
  6. rabbitmq异步_在Node.js中使用RabbitMQ和Tortoise进行异步消息传递
  7. Spring MVC表单实例
  8. 数据库系列学习(三)-数据的增、删、改
  9. atitit.thumb生成高质量缩略图 php .net c++ java
  10. android 手机 基站定位软件,安卓手机基站+GPS定位源码
  11. 微型计算机原理与应用实验指导书,微型计算机技术与应用实验指导书.doc
  12. robotium和appium的一些区别(转)
  13. c语言链表详解(超详细)
  14. 作文 我眼中的计算机1000字,我眼中的自己作文范文1000字(精选6篇)
  15. [嵌入式开发模块]SHT30/20 温湿度传感器 驱动模块
  16. HCIA网络课程第一周作业
  17. 单点登录(4):单点登录实现(附源码)
  18. Seata分布式事务控制整合Mybatis-Plus导致事务控制失效
  19. 培训班出身的前端,出路在哪儿?
  20. 2019年云计算产业市场前景研究,云计算技术发展趋势

热门文章

  1. 斐波那契问题的递归和动态规划
  2. osmnx 笔记: plot_graph_route plot_graph_routes
  3. 全国大学生数学建模如何轻松获得一等奖,我想你需要知道这样知识
  4. 深度学习核心技术精讲100篇(二十二)-深度解析数学建模核心知识之搜索与推荐模型中用户建模原理
  5. 肤色检测算法 - 基于二次多项式混合模型的肤色检测
  6. 深度学习100例 | 第28天:水果的识别与分类(准确率99.9%)
  7. LeetCode-数学-9. 回文数
  8. 【LeetCode从零单排】No19.RemoveNthNodeFromEndofList
  9. qconshanghai2014
  10. Inversion of Control Containers and the Dependency Injection pattern--Martin Fowler