类型存储

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. day04 缓冲字符流__异常处理

    缓冲字符流 缓冲字符输入流:java.io.BufferedReader 是一个高级的字符流,特点是块读文本数据,并且可以按行读取字符串. package io; import java.io.*; ...

  2. scala WordCount案例

    数据样例: java,spark,hadoop,python,datax java,spark,hadoop,spark,python,datax java,spark,hadoop,python,d ...

  3. Codeforces 缺省源

    #include <cstdio> #include <algorithm> #include <vector> using namespace std; type ...

  4. SPFA算法(SLF优化)2022.7.8更新

    SPFA可能会被卡掉,能用dijkstra就别用SPFA,代码较长,但我已尽力做到解释,请耐心看下去,存储为邻接表存储. #include<bits/stdc++.h> #define i ...

  5. 使用Properties集合存储数据,遍历取出Properties集合中的数据和Properties集合中的方法store和load

    package com.yang.Test.PropertiesStudy; import java.io.FileWriter; import java.io.IOException; import ...

  6. list集合的介绍和常用方法

    List接口介绍 java.util.List接口继承自Collection接口,是单列集合的一个重要分支,习惯性地会将实现了List接口的对象成为List集合.在List集合中允许出现重复的元素,所 ...

  7. python 部分内置函数详解

    简介 eval与exec eval和exec都是python内置的可以执行python代码的函数,但它们之间有所区别. eval(expression[, globals[, locals]]) ex ...

  8. qbxt五一数学Day2

    目录 1. 判断素数(素性测试) 1. \(O(\sqrt n)\) 试除 2. Miller-Rabin 素性测试 * 欧拉函数 2. 逆元 3. exgcd(扩展欧几里得) 4. 离散对数(BSG ...

  9. 【水】关于 __attribute__

    目录 1. weak 2. aligned 3. __packed__ 4. always_inline 1. weak 实现如果 Func1 被定义了,我就调用 Func1, 否则就调用 MyFun ...

  10. HttpServletRequest 类

    目录 HttpServletRequest类有什么作用 HttpServletRequest 类的常用方法 如何获取请求参数 doGet 请求的中文乱码解决: POST 请求的中文乱码解决 请求的转发 ...