C语言:类型存储
类型存储
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
用补码存储整数主要有以下几个好处:
- 计算加减法时,可以将符号域统一处理,简化电路设计。以-1027+1027为例,在计算机中存储计算过程为:1111101111111101 + 0000010000000011 = 10000000000000000,高位1舍去,等于0。
- 补码在变换一个数的正负属性时,其过程是相同的,不需要额外的电路设计。依然以1027为例: 对0000010000000011按位取反然后加1,得到1111101111111101,即-1027。现在对-1027,即1111101111111101按拉取反然后加1,又得到0000010000000011,即1027。
- 正零和负零在补码中的表示是相同的。
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。但是还有几种特殊情况需要处理,所以计算机在存储浮点数时有以下规定:
- 当指数部分为0且尾数部分为0时,该数为正负0。(取决于符号位)
- 当指数部分为255且尾数部分为0时,该数为正负无穷大。(取决于符号位)
- 当指数部分为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语言:类型存储的更多相关文章
- 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 ...
- C语言中存储类别又分为四类:自动(auto)、静态(static)、寄存器的(register)和外部的(extern)。
除法运算中注意: 如果相除的两个数都是整数的话,则结果也为整数,小数部分省略,如8/3 = 2:而两数中有一个为小数,结果则为小数,如:9.0/2 = 4.500000. 取余运算中注意: 该运算只适 ...
- php中弱语言类型的底层实现
PHP是弱语言类型,主要分为三类: 1.标量类型:integer.string.float.boolean 2.复合类型:array.object 3.特殊类型:resource.null php是通 ...
- c语言类型修饰符及内存
今天来学习一下c语言类型修饰符及内存分布 1.auto int a; 默认在内存 2.register int a; 限制变量定义在寄存器上的修饰符 编译器会尽量安排CPU的寄存器去存放这个a,如果寄 ...
- golang中基本类型存储大小和转换
Go语言的基本类型有: bool string int.int8.int16.int32.int64 uint.uint8.uint16.uint32.uint64.uintptr byte // u ...
- Github:修改Github仓库中项目语言类型
前述 有的时候我们把项目上传到github仓库上时语言会显示错误语言 比如一个java项目可能因为有js文件的存在而被识别为js项目 这种时候我们就要手动去修改Github的项目语言类型 解决办法 在 ...
- 怎样的操作才能让HashMap以红黑树类型存储数据? (文中没有解答该问题)
怎样才能让HashMap以红黑树类型存储数据? 看上面的代码可知:如果一个Node的长度大于等于7.就会触发Node转TreeNode的操作. 我向一个map中插入了一百万条数据(插入一亿条时,内存溢 ...
- C#_02.12_基础二_.NET类型存储和变量
C#_02.12_基础二_.NET类型存储和变量 一.核心一句:C#程序是一组类型声明(留待后面慢慢体会,现在不是很理解,不强说了) 二.数据类型: 1.预定义了16种数据类型: 其中13种简单数据类 ...
- mvc 使用预置队列类型存储异常对象
using PaiXie.Utils; using System; using System.Collections.Generic; using System.Linq; using System. ...
随机推荐
- HBase学习(二) 基本命令 Java api
一.Hbase shell 1.Region信息观察 创建表指定命名空间 在创建表的时候可以选择创建到bigdata17这个namespace中,如何实现呢? 使用这种格式即可:'命名空间名称:表名' ...
- C语言课堂--现代编译环境搭建[2020年7月]
看过了很多专家吐槽目前的大学c语言教学问题多多: 教材难懂,消磨了学生的兴趣: 环境老旧,都2020了还有在用VC6甚至TurboC 2.0,语法不规范. 轮到自己上课,心想可不能再继续这样的c语言课 ...
- 7.5 The Morning after Halloween
本题主要是存储的问题,在存储上笔者原先的代码占用了大量的内存空间 这边笔者采用暴力的思想直接硬开所有情况的16^6的数组来存储该问题,当然这在时间上是十分浪费的,因为初始化实在太慢了,剩下的就是状态转 ...
- 常用的函数式接口Consumer接口练习字符串拼接输出
题目 下面的字符串数组当中有多条信息,请按照格式"姓名: XX 性别: XX"的格式将信息打印出来,要求将 打印姓名的动作为第一个Consumer接口的Lambda实例,将打印性别 ...
- Nginx 平滑升级、Nginx的一些基础配置
# Nginx 平滑升级 # 方案一:使用Nginx服务信号进行升级 # 1.将就版本的sbin目录下可执行nginx进行备份(mv nginx nginxold) # 2.将新版本 configur ...
- placeholder 设置换行三种方式
在 html 中编写代码时保留代码换行 <textarea name="" id="" cols="30" rows="10 ...
- Windows Embedded CE 6.0开发环境的搭建(2)
最近开始在学习嵌入式,在这里首先得安装Windows Embedded CE 6.0,其中遇到了很多问题,电脑的系统以及相关配置都会在安装过程中受到影响,因此笔者就安装中的问题以及环境搭建来介绍一下. ...
- POJ2559/HDU1506 Largest Rectangle in a Histogram (cartesian tree)
Die datenstruktur ist erataunlich! #include <iostream> #include <cstdio> #include <cs ...
- ASP.NET Core依赖注入系统学习教程:容器对构造函数选择的策略
.NET Core的依赖注入容器之所以能够为应用程序提供服务实例,这都归功于ServiceDescriptor对象提供的服务注册信息.另外,在ServiceDescriptor对象中,还为容器准备了3 ...
- Java SE 10 新增特性
Java SE 10 新增特性 作者:Grey 原文地址:Java SE 10 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...