C语言笔记:第3章 数据和C
C语言中,数据类型可以分为基本数据类型、构造数据类型、指针数据类型、空类型四大类,此处只介绍基本数据类型。
bit / byte / word的基本概念:
1. 最小存储单元是位(bit),可以存储0或1,位是计算机内存的基本构建块。
2. 字节(byte)是常用的计算机存储单位。 对于几乎所有的机器, 1字节均为8位。
3. 字(word)是设计计算机时给定的自然存储单位。 对于8位的微型计算机(如, 最初的苹果机) , 1个字长只有8位。 从那以后, 个人计算机字长增至16位、 32位, 直到目前的64位。 计算机的字长越大, 其数据转移越快,允许的内存访问也更多。
基本数据类型关键字:
整型:
- int ——系统给定的基本整数类型。 C语言规定int类型不小于16位。
- short或short int ——最大的short类型整数小于或等于最大的int类型整数。 C语言规定short类型至少占16位。
- long或long int ——该类型可表示的整数大于或等于最大的int类型整数。C语言规定long类型至少占32位。
- long long或long long int ——该类型可表示的整数大于或等于最大的long类型整数。 Long long类型至少占64位。
- 无符号类型:unsigned
大小端详细描述:https://www.cnblogs.com/lingyejun/p/8312838.html
整数的存储方式
原码:正整数是直接使用原码进行存储的,比如100这个正整数,则直接把100 转换成二进制直接存储。
100 --> 0000 0000 0000 0000 0000 0000 0110 0100
补码:负数则是使用补码来存储, 补码 = 原码的绝对值 取反+ 1 取反加1时符号位不变
比如 -100 :
100 --> 1000 0000 0000 0000 0000 0000 0110 0100
取反-> 1111 1111 1111 1111 1111 1111 1001 1011
加1 --> 1111 1111 1111 1111 1111 1111 1001 1100
溢出:当超过取值范围时则会编程相邻的最小值/最大值
浮点型(实型)
概念:用来表达一个实数的数据类型
分类:占用的内存越多则精度越高
- 单精度浮点型 float , 典型尺寸 4 字节,至少精确表示小数点后6位有效数字,取值范围10-37~10+37
- 双精度浮点型 double , 典型尺寸 8 字节,至少精确表示小数点后10位有效数字
- 长双精度 long double , 典型尺寸 16 字节,至少与double精度相同
浮点数的存储:https://www.cnblogs.com/danteking/p/15170644.html
Char类型
Char固定为1个字节(byte)
ASCII表:https://www.cnblogs.com/fosoyo/archive/2007/08/09/848641.html
布尔类型:_Bool,布尔类型是无符号 int类型,所占用的空间只要能储存0或1即可。1表示true,0表示false。
不同系统环境下基本数据类型的存储长度:
类型的转换
概念: 不同的数据类型但是可以兼容的类型之间,如果出现在同一表达式中则会发生类型的转换。
数据类型之间转换的模式有两种:
- 隐式转换(自动):
若在表达式中用户没有手动进行转换,则系统会自动转为高精度的类型,
比如float + double + int --> 则系统会自动全部转为 double
- 强制转换(手动):
用户根据自己的需求进行强制的类型转换 (int )a --> 强制性把a 转换为整型
低精度 -----------------------------------------------------------------------> 高精度
char --> short --> int --> long --> float --> double --> long double
注意:不管是隐式转换还是强制转换, 准换的只是在运算的过程中 ,并不会影响到原本的数, 这是一个临时的转换。
可移植数据类型:
概念: 不管在什么系统中,数据的尺寸都是固定不不会发生变化的数据类型成为可移植数据类型。
/usr/include/x86_64-linux-gnu/bits/types.h /* Convenience types. */ typedef int TieZhu ; // 相当于用typedef 给 int 取个别名 叫 TieZhu typedef int __int32_t ; typedef long __long_64_t ; typedef unsigned char __u_char; typedef unsigned short int __u_short; typedef unsigned int __u_int; typedef unsigned long int __u_long; /* Fixed-size types, underlying types depend on word size and compiler. */ typedef signed char __int8_t; // 有符号8位整型 typedef unsigned char __uint8_t; // 无符号8位整型 typedef signed short int __int16_t; typedef unsigned short int __uint16_t; typedef signed int __int32_t; typedef unsigned int __uint32_t; #if __WORDSIZE == 64 // ---> 判断系统的位数(字长) 如果是 64位 typedef signed long int __int64_t; // 64位系统中 long int 就是 64位的有符号整型 typedef unsigned long int __uint64_t;// 64位系统中 long int 就是 64位的无符号整型 #else // ---> 判断系统的位数(字长) 如果不是 64位系统 则判断为 32 位系统 __extension__ typedef signed long long int __int64_t; // 在32位系统中 long long 才占用 64位 __extension__ typedef unsigned long long int __uint64_t; #endif
limits.h中的一些明示常量
float.h中的一些明示常量