目录
一、数据类型有哪些:
char //字符数据类型(1个字节) long double //更长的双精度浮点数 |
类型的意义:
1. 使用这个类型开辟内存空间的大小(大小决定了使用范围)。
2. 如何看待内存空间的视角。
二、类型的基本归类:
1.整形家族:
char unsigned char(unsigned表示无符号) signed char short unsigned short [int] signed short [int] int unsigned int signed int long unsigned long [int] signed long [int] |
注:对于char类型,字符存储时,存储的是ASCll码值,实际还是整型。
2.浮点数家族:
float double long double |
3.构造类型:
数组类型 结构体类型 struct |
注:
在数组类型中,int arr1[5] 和 int arr2[10]代表的不是同一个类型,当去掉数组名之后才为该构造类型的类型,分别为int [5] 和 int [10]。
4.指针类型:
int *pi; |
4.空类型:
void 表示空类型(无类型) 通常应用于函数的返回类型、函数的参数、指针类型。 |
三、整型在内存中的存储
当一个变量创建时是会在内存中开辟空间的,那么是如何开辟的?
1.原码、反码、补码
1.1原码、反码、补码介绍
计算机中的整数有三种2进制表示方法,即原码、反码和补码。
三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位。
正数的原、反、补码都相同。 |
负整数的三种表示方法各不相同。 补码:反码+1就得到补码。 |
1.2 原码、反码、补码的转换
1.3 内存中存放形式
对于整形来说:数据存放内存中其实存放的是补码。
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
2.整形表示范围
首先,我们要知道变量开辟空间的大小是由数据类型决定的,所以我们要了解整形的表示范围,根据要表示的数据选择合适大小的数据类型。
整型数据类型表示范围可以在<limits.h>中找到,也可以自己计算得到。
比如: char类型表示范围指1字节也就是8个bit位表示的所有可能,分为signed char 类型 和unsigned char 类型,两者由于符号位,表示的范围也就不同: 对于unsigned char类型(补码): 对于signed char类型(补码): |
<limits.h>文件
3. 大小端介绍
观察数据在内存中的存储,如下:
a补码的值为00000000 00000000 00000000 00010100,转换为16进制为00 00 00 14
b补码的值为111111111 111111111 111111111 11110110,转换为16进制为ff ff ff f6;
我们发现在内存中好像顺序是不对的,为什么要这样存储呢?
为什么有大端和小端: 因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8 bit。但是在C语言中除了8 bit的char之外,还有16 bit的short |
大端小端概念:
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中; |
例如:一个 16bit 的 short 型 x ,在内存中的地址为 0x0010 , x 的值为 0x1122 ,那么 0x11 为高字节, 0x22 为低字节。对于大端模式,就将 0x11 放在低地址中,即 0x0010 中, 0x22 放在高地址中,即 0x0011 中。小端模式,刚好相反。我们常用的 X86 结构是小端模式,而 KEIL C51 则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。
4.用例题理解
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n",a);
return 0;
}
试着推出该题的答案:
首先:-128的原码:10000000 00000000 00000000 10000000
反码: 11111111 11111111 11111111 01111111
补码: 11111111 11111111 11111111 10000000
由于char在内存中只占1个字节,所以发生截断,a中存的数字为10000000,
在printf语句,%u表示打印无符号的十进制整型,首先会发生整型提升,c语言未规定char是signed char 还是 unsigned char,但是VS上为signed char,根据整型提升的规则会按照符号位来提升,高位补充符号位,即为11111111 11111111 11111111 10000000,结果为4294967168。
进行编译,编译结果与计算结果相同。
总结
总的来说,整型数据在内存中存储是通过分配一定的内存空间,以二进制形式存储,并分配唯一的内存地址来实现的。