数据在内存中的存储
数据类型的介绍
整形:
char //字符数据类型(1字节)
unsigned char
signed char
short //短整型(2字节)
unsigned short [int]
signed short [int]
int //整形(4字节)
unsigned int
signed int
long //长整型(4字节)
long long //(8字节)
unsigned long [int]
signed long [int]
浮点数:
float (8字节)
double(16字节)
构造类型:
数组类型
结构体类型 struct
枚举类型 enum
联合类型 union
空类型 void
指针类型:
char *
int *
float *
void * (and so on)
整形在内存中的存储
我们一般定义的数据类型都是需要在内存中开辟空间的,如 int i=1,double j=1.0;而这些数据都是以补码的形式存放在内存中。
下面我们先来了解原码、反码、补码:
计算机中的有符号数有三种表示方法,即原码、反码和补码。
三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位
三种表示方法各不相同。
原码
直接将二进制按照正负数的形式翻译成二进制就可以。
反码
将原码的符号位不变,其他位依次按位取反就可以得到了。
补码
反码+1就得到补码
需要注意的是,正数的原、反、补码都是相同的
而负数的补码的计算方式为符号位(即首位1不变),其余取反再加一则可得。
在这里我们需要注意一个存储方式,大端存储模式与小端存储模式,如下:
我们可以清楚地看到,a的值为1,但是它存储的方式却是01 00 00 00(这里是十六进制)。这里就需要设计到大小端存储模式了。
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。
我们假设一个整形值n为0x11223344,系统采用大小端存储模式分别如下:
上框为小端模式,即低字节存储到低地址
下框为大端模式,即低字节存储到高地址。
下面是大小端判断的程序:
#include <stdio.h>
int main()
{
int a = 0x11223344;
char* p = (char*)(&a);
if (*p