1.C语言的本质
C语言的本质就是对内存的操作
2.内存的最小单位
内存操作的最小单位为字节,1个字节占8个bits位,可以用【7:0】bit表示。
在内存的每个字节都有一个唯一的地址,操作内存时本质就是通过地址进行访问的。
内存的抽象图:
3.C语言的数据类型
4.整形数据类型
有符号整形:
signed short
signed int
signed long
signed long long
注:对于有符号的整形,可以省略signed关键字
无符号整形:
unsigned short
unsigned int
unsigned long
unsigned long long
注:对于无符号的整形,不可以省略unsigned关键字
4.1 short类型(短整型)
short类型的数据在内存中占用2个字节的空间,共计16个bits,使用[15:0]bits表示。
signed short类型的数据在内存中存储数据的范围:
数据的最高位是符号位,signed short类型的数据[15]bit为符号位,
符号位为0时,表示正数,符号位为1时,表示负数。
数据范围:-32768(2^15) ~ 32767(2^15 - 1)
unsigned short类型的数据在内存中存储数据的范围:
unsigned short类型的数据没有符号位,最高位也是数据位。
数据范围:0 ~ 65535(2^16 - 1)
最高位为符号位
4.2 int类型
int类型的数据在内存中占用4个字节的空间,共计32个bits,使用[31:0]bits表示。
signed int类型的数据在内存中存储数据的范围:
数据的最高位是符号位,signed int类型的数据[31]bit为符号位,
符号位为0时,表示正数,符号位为1时,表示负数。
数据范围:-2,147,483,648(2^31) ~ 2,147,483,647(2^31 - 1)
unsigned int类型的数据在内存中存储数据的范围:
unsigned int类型的数据没有符号位,最高位也是数据位。
数据范围:0 ~ 4,294,967,295(2^32 - 1)
4.3长整形(long)
32位操作系统:
long类型的数据在内存中占用4个字节的空间,共计32个bits,使用[31:0]bits表示。
signed long类型的数据在内存中存储数据的范围:
数据的最高位是符号位,signed long类型的数据[31]bit为符号位,
符号位为0时,表示正数,符号位为1时,表示负数。
数据范围:-2,147,483,648(2^31) ~ 2,147,483,647(2^31 - 1)
unsigned long类型的数据在内存中存储数据的范围:
unsigned long类型的数据没有符号位,最高位也是数据位。
数据范围:0 ~ 4,294,967,295(2^32 - 1)
64位操作系统:
long类型的数据在内存中占用8个字节的空间,共计64个bits,使用[63:0]bits表示。
signed long类型的数据在内存中存储数据的范围:
数据的最高位是符号位,signed long类型的数据[63]bit为符号位,
符号位为0时,表示正数,符号位为1时,表示负数。
数据范围:-2^63 ~ 2^63 - 1
unsigned long类型的数据在内存中存储数据的范围:
unsigned long类型的数据没有符号位,最高位也是数据位。
数据范围:0 ~ 2^64 - 1
4.4长长整形(long long)
long long类型的数据在内存中占用8个字节的空间,共计64个bits,使用[63:0]bits表示。
signed long long类型的数据在内存中存储数据的范围:
数据的最高位是符号位,signed long类型的数据[63]bit为符号位,
符号位为0时,表示正数,符号位为1时,表示负数。
数据范围:-2^63 ~ 2^63 - 1
unsigned long long类型的数据在内存中存储数据的范围:
unsigned long类型的数据没有符号位,最高位也是数据位。
数据范围:0 ~ 2^64 - 1
5.字符型(char类型)
字符类型在内存中占用1字节的空间,共计8个bits,使用[7:0]bits表示。
signed char类型的数据在内存中存储数据的范围:
数据的最高位是符号位,signed char类型的数据[7]bit为符号位,
符号位为0时,表示正数,符号位为1时,表示负数。
数据范围:-128 ~ 127
unsigned char类型的数据在内存中存储数据的范围:
unsigned char类型的数据没有符号位,最高位也是数据位。
数据范围:0 ~ 255
6.实型(浮点数)
float : 单精度的浮点型,占用内存空间大小为4字节。
double : 双精度的浮点型,占用内存空间的大小为8字节。
float和double类型的数据在内存中存储时,采用的是科学计数的方式。
7.空类型(void类型)
void类型占用的内存空间大小为0字节。
在linux系统中使用sizeof(void)测试void类型的大小时,默认返回的值为1.
在linux系统中使用sizeof(void)测试大小时,返回1,1这个值只是占位,
实际上void类型的大小为0字节,因此系统并没有给void类型分配内存空间。
8.案例
使用sizeof运算符,计算数据类型占用内存空间的大小。
sizeof(数据类型)
1> 如果是32位系统,sizeof()返回的是一个unsigned int类型的数据,
使用%d格式化字符打印结果
2> 如果是64位系统,sizeof()返回的是一个unsigned long类型的数据,
使用%ld格式化字符打印结果
#include <stdio.h>
int main(int argc, const char *argv[])
{
printf("short类型数据的大小 = %ld\n", sizeof(short));
printf("unsigned short类型数据的大小 = %ld\n", sizeof(unsigned short));
printf("int类型数据的大小 = %ld\n", sizeof(int));
printf("unsigned int类型数据的大小 = %ld\n", sizeof(unsigned int));
printf("long类型数据的大小 = %ld\n", sizeof(long));
printf("unsigned long类型数据的大小 = %ld\n", sizeof(unsigned long));
printf("long long类型数据的大小 = %ld\n", sizeof(long long));
printf("unsigned long long类型数据的大小 = %ld\n", sizeof(unsigned long long));
printf("char类型数据的大小 = %ld\n", sizeof(char));
printf("unsigned char类型数据的大小 = %ld\n", sizeof(unsigned char));
printf("float类型数据的大小 = %ld\n", sizeof(float));
printf("double类型数据的大小 = %ld\n", sizeof(double));
printf("void类型数据的大小 = %ld\n", sizeof(void));
return 0;
}