类型存储

char: 可能为signed char 或 unsigned char ,根据编译器不同实现不同。占位一个字节。Signed char取值范围为-128~127, unsigned char 取值范围为0~255。

举例:‘A’: 65 内存中的位模式:

0

1

0

0

0

0

1

0

short: 通常占位2字节。默认为signed short, 取值范围-215~215-1。另有unsigned short,取值范围0~216-1。

举例:1027:内存中的位模式(本文一律采用大端存储的方式):

0

0

0

0

0

1

0

0

0

0

0

0

0

0

1

1

-1027:位模式:

1

1

1

1

1

0

1

1

1

1

1

1

1

1

0

1

计算机采用补码来存储整数。补码的表示方法如下:

正数:与原码相同;

负数:对其绝对值原码按位取反,然后加1

用补码存储整数主要有以下几个好处:

  1. 计算加减法时,可以将符号域统一处理,简化电路设计。以-1027+1027为例,在计算机中存储计算过程为:1111101111111101 + 0000010000000011 = 10000000000000000,高位1舍去,等于0。
  2. 补码在变换一个数的正负属性时,其过程是相同的,不需要额外的电路设计。依然以1027为例: 对0000010000000011按位取反然后加1,得到1111101111111101,即-1027。现在对-1027,即1111101111111101按拉取反然后加1,又得到0000010000000011,即1027。
  3. 正零和负零在补码中的表示是相同的。

int: 通常占位2或4个字节。现代编译器多为4字节,故现以4字节为准。默认为 signed int,取值范围-231~231-1。另unsigned int,取值范围0~232-1。

举例:65539:

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

1

1

-65539:

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

0

1

1

1

1

1

1

1

1

1

1

1

1

1

1

0

1

long: 通常占位4或8字节。占位4字节时与int相同,占位8字节时与long long相同。略。

long long: 通常占位8字节。默认signed long long,取值-263~263-1。另unsigned long long,取值0~264-1。举例略。

注:c99中仅要求:sizeof(short) <= sizeof(int) <= sizeof(long) < sizeof(long long),对各类型占字节数并无明确规定,与各编译器的实现有关。

float: 占位4字节,其内存中位模式布局如下:

S

Exponent

Mantissa

其中,最高位(第31位)S为符号位,取值0(正数),1(负数)。

后面的八位(第30~23位),为指数位,取值0~255。

最后的二十三位(第22~0位),为尾数位,分别代表2-1,2-2……2-23

Float代表的数值f = (-1)S * (1+Mantissa) * 2(exponent - 127),所以理论上浮点数可表示的取值范围为-(2 - 2-23)*2128 ~ (2 - 2-23)*2128。但是还有几种特殊情况需要处理,所以计算机在存储浮点数时有以下规定:

  1. 当指数部分为0且尾数部分为0时,该数为正负0。(取决于符号位)
  2. 当指数部分为255且尾数部分为0时,该数为正负无穷大。(取决于符号位)
  3. 当指数部分为255且尾数部分不为0时,该数非法(NaN)。

所以实际上浮点数可表示的取值范围为-(2 - 2-23)*2127 ~ (2 - 2-23)*2127

举例:19.375:先将19.375的整数部分与小数部分分别二进制化,得到10011.011,然后将其通过移位变换到1~2-2-31范围内:1.0011011 * 24,于是得到其在内存中的位模式:

0

1

0

0

0

0

0

1

1

0

0

1

1

0

1

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

又如:-0.625:其二进制表示为-0.101,移位得:-1.01 * 2-1,于是得其在内存中的位模式:

1

0

1

1

1

1

1

1

0

0

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

但是有些小数是无法在有限的位数内将其二进制化的,以0.9为例,对其二进制化将得到一个无限循环的二进制小数:0.1110011001100……,可我们存储小数部分的只有二十三位,于是只能将后面的部分截断,这就产生了浮点数的精度问题。这也是为什么不能对浮点数用==符号判断相等的原因:计算机是按位比较来判断两数是否相等的,但0.9与0.3 + 0.6的内存位模式布局却可能是不一样的。

0.9内存布局:

0

0

1

1

1

1

1

1

0

1

1

0

0

1

1

0

0

1

1

0

0

1

1

0

0

1

1

0

0

1

1

0

a = 0.3; b = 0.6; c = a + b; c的内布局为:

0

0

1

1

1

1

1

1

0

1

1

0

0

1

1

0

0

1

1

0

0

1

1

0

0

1

1

0

0

1

1

1

float的精度由其尾数决定,因223 = 8388608,共七位,故float的精度为小数点后6~7位有效数字。

double: 占位8字节。其存储原理与float相同,不过将指数部分扩展到11位,将尾数部分扩展到52位。其取值范围为:-(2 - 2-52) * 21023~(2 - 2-52) * 21023。其精度为小数点后15~16位有效数字。举例略。

Pointer通常定义为 unsigned long类型。占位4或8字节。

数组:在内存中连续存储同一类型的数据。

举例: char letters[] = {‘A’, ‘B’, ‘C’, ‘D’};letters 内存布局:

A

B

C

D

struct: 在内存中连续存储多种(不同类型)数据。

举例:struct {int a, char b[4], short c[2]}st; st内存布局:

int

char

char

char

char

short

short

union: 在内存中存储多种(不同类型)数据,这些数据共用同一块内存,同一时间只能访问其中某一种数据。

举例:union{int a, short b, char c}un; un内存布局:

|---------------------------------------------- int -----------------------------------------------|

|---------------------short--------------------|

|----------char--------|

C语言:类型存储的更多相关文章

  1. 2016年11月3日JS脚本简介数据类型: 1.整型:int 2.小数类型: float(单精度) double(双精度) decimal () 3.字符类型: chr 4.字符串类型:sting 5.日期时间:datetime 6.布尔型数据:bool 7.对象类型:object 8.二进制:binary 语言类型: 1.强类型语言:c++ c c# java 2.弱类型语

    数据类型: 1.整型:int 2.小数类型: float(单精度) double(双精度) decimal () 3.字符类型: chr 4.字符串类型:sting 5.日期时间:datetime 6 ...

  2. C语言中存储类别又分为四类:自动(auto)、静态(static)、寄存器的(register)和外部的(extern)。

    除法运算中注意: 如果相除的两个数都是整数的话,则结果也为整数,小数部分省略,如8/3 = 2:而两数中有一个为小数,结果则为小数,如:9.0/2 = 4.500000. 取余运算中注意: 该运算只适 ...

  3. php中弱语言类型的底层实现

    PHP是弱语言类型,主要分为三类: 1.标量类型:integer.string.float.boolean 2.复合类型:array.object 3.特殊类型:resource.null php是通 ...

  4. c语言类型修饰符及内存

    今天来学习一下c语言类型修饰符及内存分布 1.auto int a; 默认在内存 2.register int a; 限制变量定义在寄存器上的修饰符 编译器会尽量安排CPU的寄存器去存放这个a,如果寄 ...

  5. golang中基本类型存储大小和转换

    Go语言的基本类型有: bool string int.int8.int16.int32.int64 uint.uint8.uint16.uint32.uint64.uintptr byte // u ...

  6. Github:修改Github仓库中项目语言类型

    前述 有的时候我们把项目上传到github仓库上时语言会显示错误语言 比如一个java项目可能因为有js文件的存在而被识别为js项目 这种时候我们就要手动去修改Github的项目语言类型 解决办法 在 ...

  7. 怎样的操作才能让HashMap以红黑树类型存储数据? (文中没有解答该问题)

    怎样才能让HashMap以红黑树类型存储数据? 看上面的代码可知:如果一个Node的长度大于等于7.就会触发Node转TreeNode的操作. 我向一个map中插入了一百万条数据(插入一亿条时,内存溢 ...

  8. C#_02.12_基础二_.NET类型存储和变量

    C#_02.12_基础二_.NET类型存储和变量 一.核心一句:C#程序是一组类型声明(留待后面慢慢体会,现在不是很理解,不强说了) 二.数据类型: 1.预定义了16种数据类型: 其中13种简单数据类 ...

  9. mvc 使用预置队列类型存储异常对象

    using PaiXie.Utils; using System; using System.Collections.Generic; using System.Linq; using System. ...

随机推荐

  1. led跑马灯多种方法(移位法,位拼接法,调用模块法,位移及位拼接语法,testbench的理解,源文件的存储路径,计数器的个数,调用模块的方式)

    跟着教程写了几种方法,才发现自己写的虽然能实现,但比较繁琐.教程有三种方法: 1.移位法,每次左移一位,相比我自己写的,优点是不用把每一种情况都写出来.但是需要考虑左移到最后一位时需要自己再写个赋值语 ...

  2. hive SQL 初学者题目,实战题目 字符串函数,日期拼接,开窗函数。。。。

    sql:Hive实现按照指定格式输出每七天的消费平均数输出格式:2018-06-01~2018-06-07 12.29...2018-08-10~2018-08-16 80.67 答案:-- 1.先将 ...

  3. Linux 加密安全和私有CA的搭建方法

    常用安全技术 3A: 认证:身份确认 授权:权限分配 审计:监控做了什么 安全通信 加密算法和协议 对称加密: 非对称加密 单向加密:哈希(hash)加密 认证协议 对称加密: 加密和解密使用的是同一 ...

  4. JavaWeb--HTTP与Maven

    前言 Java Web 其实就是一个技术的总和,把Web看成一个容器而已主要使用JavaEE技术来实现.在加上各种中间件. 整个javaWeb阶段的内容通过实际的案例贯穿学习, 所涉及到的技术知识点会 ...

  5. 网络编程、OSI七层协议

    目录 软件开发架构 1.什么是软件开发架构 2.软件开发架构 3.架构优劣势 4.架构发展趋势 网络编程简介 1.如何理解网络编程 2.网络编程的目的 3.网络编程的意义 4.网络编程的起源 5.网络 ...

  6. centos/windows服务器,Mysql数据库表结构损坏-已解决

    [问题原因]服务器突然断电 [故障报告]数据库表结构损坏 [解决思路]进入强制恢复模式,备份库表及数据重建 故障发现 周末公司断电,周一启动数据库就直接报错了 查看日志 上面标记的log,明确表示是非 ...

  7. HCIA-datacom 4.3 实验三:网络地址转换配置实验

    实验介绍: 网络地址转换NAT(Network Address Translation)是将IP数据报文头中的IP地址转换为另一个IP地址的过程.作为减缓IP地址枯竭的一种过渡方案,NAT通过地址重用 ...

  8. PerfView专题 (第十篇):洞察 C# 终结队列引发的内存泄漏

    一:背景 C# 程序内存泄漏的诱发因素有很多,但从顶层原理上来说,就是该销毁的 用户根 对象没有被销毁,从而导致内存中意料之外的对象无限堆积,导致内存暴涨,最终崩溃,这其中的一个用户根就是 终结器队列 ...

  9. 新年趣事之红包--"四边形"不等式优化DP

    目录 题目描述 输入 输出 思路 新年趣事之红包 时间限制: 1 Sec  内存限制: 64 MB 题目描述 xiaomengxian一进门,发现外公.外婆.叔叔.阿姨--都坐在客厅里等着他呢.经过仔 ...

  10. CF662C Binary Table (快速沃尔什变换FWT)

    题面 题解 我们会发现,如果单独的一列或一行,它的答案是O1确定的,如果确定了每一行是否变换,那么最后的答案也就简单了许多, 如果确定了行的变换状压下来是x(即x的i位表示第i行是否变换,理解就行), ...