<C和指针---读书笔记1>
C代码的无非是在一定的条件对数据进行操作处理。那么C语言中主要有几类数据? 数据如何访问?数据如何存储,这几个方面是我们事先需要掌握的。
<3.1 基本数据类型>
从我们生活实际应用的角度出发:数据有小数和整数、正负之分; 那么在C语言中,是这样的吗?该怎么定义正负数、小数呢?
整数家族:早期,内存很小的,为了节省存储空间、整数有8位整数、长整数、整数、短整数;你可以根据实际情况选择使用不同长度;
怎么书写呢? 使用前缀关键字的做法: char a ; long int a ; int a ; short int a 来表示。
长度设计好了,正负号怎么分? 默认int是 带有正负号的,可以使用 usigned 变为正数。 char需要前缀 signed 、unsigned 来区分。
虽然说是:长度能区分出来了,但具体是几位的,还没有具体讲清楚:
有下面的表达式: 长整型至少跟整型一样长、整型至少跟短整型一样长。短整型≥16位。具体int是16还是32位、long int 是16、32还是64,
就要看不同的编译器怎么决定了。 这样造成一个坏处就是:移植起来可能会碰到问题。
还需要注意的是 不同的编译器、不加unsigned/signed 的裸体char,有可能被认为是 unsigned char、也有可能被认为是 signed char. 也会对
移植带来负面影响。
C语言中整数的书写: 整数的书写规则,我们就不做太多的介绍了。
小数家族: 浮点数,顾名思义:小数点漂浮不定。
还有一种是定点数: 小数点位置固定好的数据。比如32位数据:约定小数点永远在第五位之后。
11111.111_11111111_11111111_11111111 表示的是最大值 ≈ 32 32-2^(-27) .
00000.000_ 00000000_ 00000000_ 00000001表示是最小值: 2^(-27) .
显然这样 一个32位的定点数,只能表示 { 2^(-27) } ~ { 32- 2^(-27) } 。那小数点位置后移? ---最大值变大但也导致精度也变差。
所以浮点数应运而生. K&R C 标准中定义一个32位的 浮点数组成如下:
符号1位 | 指数8位 | 尾数23位
符号位代表 正负、 指数位代表 2^(±N)次方 ,尾数表示小数点后的值。
举个例子: 123.456 用二进制表示是 1111011.01110100101111001
借用数学上的E指数表示法: 123.456 = 1.111011 01110100101111001 * 2^6
所以 得 N等于 10000110 .尾数等于 111011 01110100101111001
所以整个浮点数: 0_00000110_ 111011 01110100101111001 = 1.111011 01110100101111001 * 2^(6)
浮点数的大小范围: 很显然 1.1111111111111111111111111*2^(+127) 是最大值。 它约等于 2* 2(127) = 3.4*10^38
1.1111111111111111111111111*2^(-127) 是最小值,它约等于 -2* 2(127) = -3.4*10^38
这就是我们常见的 浮点数范围 是 -3.4*10^38 ~ 3.4*10^38 的来源。
讲过浮点数的最大最小范围,就得说下 浮点数的精度问题。
即 0.00000000000000000000001* 2(0) = 2^(-23) ≈ 0.000000119. 也就是说 Δ = 0.000000119 是最小的差值了,也就是最小步长。
浮点数的表示方法: float 和double
在C语言中,有四种数据类型: 基本类型、指针、聚合类型(如数组和结构)、空类型
基本类型(整数和浮点数)大致介绍了、指针是什么?聚合类型呢? 空类型?
指针变量 就是其值为内存地址的变量。 这个类型奇怪的地方在于,其值是真实物理地址信息。
所以当你想操作某个物理地址时,使用它就很方便了.
聚合类型: 各类数据拼接在一起的类型.统一管理