基本数据类型
C语言中基本数据类型分为三类:整型、字符型、浮点型。
每一类又可以分为有符号signed和无符号unsigned,从而所表示的取值范围不同。
提示:取值范围视不同编译器和系统环境有所不同。
基本规律是:
比如无符号的int,在N位系统中的取值范围是0-(2的N次方-1)
一、类型由来
内存运行的本质是由许许多多的位(bit)在1和0状态之间来回变化。
在高级语言出现之前,使用汇编语言操作内存,编码时,可能是这样的,这个用1个bit,那个用3个bit,那个用4个bit,数据多了,很难读,容易记乱。
随着存储技术的发展,内存容量越来越大,可以按字节为单位进行操作了。为了易读,给固定大小的内存块起个名称,通过名称来分配内存。给1个字节起名char,给2个字节起名short,给4个字节起名int,数据类型就这样诞生了,高级语言中就是这样做的。
二、定义变量
数据类型好比一个模具,从内存中卡出一个固定大小的内存块,不同类型卡出来的内存块也不同。
再后来发现,需要用多个大小一样的内存块,如果用char1,char2,int1 这样的方式去命名,非常不好记。为了易记,给各种内存块起个有意义的名称,变量就这样诞生了。
char a;
short b;
int age;
变量定义其实就是在内存空间中卡出固定大小的内存块。
有时候虽然知道基本数据类型在不同系统和编译器下,占用的字节数会有不同,但记不得具体了,怎么办呢?去翻书或查资料,也可以,但更好的办法是在当前软件环境下,直接编代码,运行查看类型的实际占用字节就可以了。总之,编程序需要灵活变通,就地取材,而不应该死记硬背。
#include <stdio.h>
int main()
{
char c=0;
short s=0;
int i=0;
printf("char size is %d\r\n",sizeof(char),sizeof(c));
printf("short size is %d\r\n",sizeof(short),sizeof(s));
printf("int size is %d\r\n",sizeof(int),sizeof(i));
return 0;
}
运行结果:
char size is 1
short size is 2
int size is 4
用类型起的别名在内存中都是有起始地址编号及地址范围的,假如从地址编号0开始存放,以字节为最小单位。
默认顺序连续存放,假如是16位寻址方式。
char c; //起始地址编号是0,16位地址表示为0x0000
short s; //起始地址编号是1,范围是1-2,16位地址表示为0x0001-0x0002
int i; //起始地址编号是3,范围是3-6,16位地址表示为0x0003-0x0006
指定地址去存放(实际应用中指定地址很危险),假如是16位寻址方式。
int *p; p=(int *)0x07D3; //起始地址编号是2003,范围是2003-2006,16位地址表示为0x07D3-0x07D6
在实际编码中,通常将基本数据类型重新起新的名称,即起别名。别名中的数字是占的Bit位数,方便知道占用多少个字节。使用 typedef 给现有类型重新起个易懂易记又有意义的新名称。
typedef unsigned char uint8
typedef unsigned short uint16
typedef unsigned long uint32
typedef unsigned bool
typedef signed char int8
typedef signed short int16
typedef signed long int32
定义变量的时候如何选择数据类型?
根据变量要存储的值的范围和类型来选择,合适的就是最好的。
二、变量赋值
变量赋值应遵循的规则:
1、值的类型与变量类型一致,比如浮点值不能赋给字符类型变量
2、值不能超出变量所占的内存大小。
细节大多时候决定了成败。有时候写程序犯糊涂,定义无符号char类型的变量,进行自增去跟500比大小,超过500就执行任务,可发现一直不会出执行任务,因为变量增加到255后又归零了。
值大,类型选小,变量就放不下值。—— 虾米吃大鱼,根本吃不下。
值小,类型选大,变量的空间就浪费。—— 大鱼吃小鱼,小鱼吃虾米。
内容持续补充和改进中…