类型存储

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. 4-1 Spring框架基础知识

    Spring框架基础知识 1.Spring 框架作用 主要解决了创建对象和管理对象的问题. 自动装配机制 2.Spring 框架 (Spring容器,JavaBean容器,Bean容器,Spring容 ...

  2. GFS分布式文件系统

    一.文件系统简介1.文件系统的组成接口:文件系统接口功能模块(管理.存储的工具):对对象管理里的软件集合对象及属性:(使用此文件系统的消费者)2.文件系统的作用从系统角度来看,文件系统时对文件存储设备 ...

  3. Trie 树总结

    Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,PATRICIA tree,以及bitwise版本的crit-bit tree.当然很多名字的意义其实有交 ...

  4. 使用 Azure 静态 Web 应用服务免费部署 Hexo 博客

    一.前言 最近在折腾 Hexo 博客,试了一下 Azure 的静态 Web 应用服务,发现特别适合静态文档类型的网站,而且具有免费额度,支持绑定域名.本文只是以 Hexo 作为示例,其他类型的框架也是 ...

  5. BufferedWriter字符缓冲输出流和BufferedReader字符缓冲输入流

    package com.yang.Test.BufferedStudy; import java.io.BufferedWriter; import java.io.FileWriter; impor ...

  6. BACnet MS/TP转MQTT网关金鸽BL103

    BACnet MS/TP转MQTT网关金鸽BL103BL103是一款BACnet路由器,实现 BACnet MS/TP 总线和以太网 BACnetIP 之间通信路由功能,同时也是一款Modbus RT ...

  7. 自动提交本地git仓库脚本

    #! /bin/bash git_user_name=`git config user.name` git_user_mail=`git config user.email` branch_name= ...

  8. AOP实现切入

    6.AOP实现切入 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程 通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术 AOP是OOP的延续,也 ...

  9. Luogu3594 [POI2015]WIL-Wilcze doły (双端队列)

    单调性显然,双端队列队列维护严格单调递减手写双端队列真的可恶. #include <iostream> #include <cstdio> #include <cstri ...

  10. SpringBean的实例化

    在Spring框架中,想使用Spring容器中的Bean,需要先实例化Bean SpringBean的实例化有3种方式 构造方法实例化 (最常用) 在Java配置类中,写一个构造方法,在这个构造方法中 ...