1、数据类型的详细介绍
基本的内置类型:
char //字符数据类型
short //短整型
int //整型
long //长整型
long long //更长的整型(在32位平台下是4个字节,在64位平台下是8个字节)
float //单精度浮点型
double //双精度浮点型
//C语言是否有字符串类型
类型的意义:
1、使用这个类型开辟内存空间的大小(大小决定了适用范围)
2、如何看待内置空间的视角
1.1类型的基本归类
整型:
char //char之所以也属于整型是因为字符在内存中存的是ASCII值,是整型
unsigned char
singed char
short
unsigned short[int]
signed short[int]
int
unsigned int
signed int
long
unsigned long[int]
signed long[int]
//int a; ——> signed a;而char到底是unsigned char还是signed char是标准未定义的,取决于编译器的实现。而short、long和int都是一样的。
//之所以存在有符号和无符号之分,是因为数据有时仅存在正数,如:身高、体重,没有符号位一说,这时候我们就用unsigned int;也有一些数据即有正数又有负数存在的可能性,比如:温度。这时候是正是负取决于符号位,符号位为0是正数,为1是负数,我们就用signed int
浮点型:
float
double
//只要是表示小数就可以用浮点型,float的精度低,存储的数据范围较小,而double的精度更高,存储的数据范围更大
构造类型(自定义类型):
> 数组类型 //比如int arr[10]的类型是int [10]
> 结构体类型 struct
> 枚举类型 enum
> 联合类型 union
指针类型:
int *p;
char *pa;
float* pb;
void *pc;
空类型:
void表示空类型(无类型)
通常应用于函数的返回类型、函数的参数、指针类型
//第一个void表示函数不会返回值
//第二个void表示函数不需要传任何参数
void test(void)
{
}
int main()
{
return 0;
}
2、整形在内存中的存储
变量的创建是要在内存中开辟空间的,空间的大小是根据不同类型而决定的。那么数据在所开辟的内存空间中到底是如何存储的?
int a=20;
int b=-10;
2.1原码、反码、补码
计算机中的整数有3种二进制表示方法,即原码、反码、补码
原码:根据数值的正负直接写出二进制序列
反码:符号位不变,其他位按位取反
补码:反码+1
正的整数原码、反码、补码相同
负的整数的原码、反码、补码需要计算
int main()
{
int a=20;
//00000000000000000000000000010100
//20是正整数原码、反码、补码相同
//用16进制位表示
//0x00 00 00 14
int b=-10;
//10000000000000000000000000001010——原码
//0x80 00 00 0a
//11111111111111111111111111110101——反码
//0xfffffff5
//11111111111111111111111111110110——补码
//0xfffffff6
return 0;
}
我们会发现调试所显示的存储方式和我们计算的方式是一样的,存的是整数的补码
结论:整型在内存中是以补码的形式存放的。
那为什么要存放补码呢?
在计算机系统中,数值一律用补码表示和储存。原因在于,使用补码,可以将符号位数值域统一处理。
同时,加法和减法也可以统一处理(cpu只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。(因为补码符号位不变,其他位按位取反再+1可以得到原码)
2.2大小端的介绍
什么是大端和小端:
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中。
假设我们要存20,我们知道20的16进制为0x00 00 00 14
有两种存储形式:
1、00 00 00 14(大端字节序存储)
2、14 00 00 00(小端字节序存储)
为什么有大端和小端:
这两种模式的选择取决于特定的系统架构和操作系统。例如,Intel x86架构采用的是小端模式,而某些版本的ARM处理器则可以选择大端模式或小端模式。 大端和小端的概念之所以重要,是因为它们直接影响到多字节数据类型的操作和处理。例如,当你从一个文件读取数据或将数据写入到一个文件时,你需要确保文件的格式与你所使用的系统的字节顺序相匹配。如果不匹配,可能会导致数据损坏或丢失。 总的来说,大端和小端是描述数据如何在内存中存储的重要概念,它们对于理解和处理多字节数据类型至关重要。
2.3练习:
设计一个小程序来判断当前机器的字节序
#include<stdio.h>
int main()
{
int a = 1;
if (*(char*)&a == 1)//强制类型转换,char*只取第一个字节
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
本次分享就到这里,感谢观看和关注!