目录
数据类型
signed 和 unsigned 详细解释
signed 和 unsigned都可以修饰int、short、float、char等数据类型。
signed 表示 有符号的,带signed的变量可以存放负数。
unsigned 表示 无符号的,带unsigned的变量不可以存放负数,只能存放 0 和 正数。
例子:
ch1和a1变量是可以存放负数的,ch2和a2变量只能存放 0 和 正数。
signed char ch1;
unsigned char ch2;
signed int a1,
unsigned int a2;
但是,signed char 其实就是 char类型,也就是说 signed char 相等于 char,int类型,float等数据类型也是如此。
数据类型都满足下面这个语法规则:
signed + 数据类型 == 数据类型
(== 在计算机里是相等的意思)
signed 是可以省略不写的!
不过一般我们建立新变量的时候,不用加上 signed 。
比如:我们要建立一个有符号的char变量
我们只要这样就行了
char ch;
不用在char前面加上signed。
unsigned一般用于无负数的数值,比如身高、体重、个数。
整型家族
char
unsigned char、[signed] char
short
unsigned short [int]、[signed] short [int]
int
unsigned int、[signed] int
long
unsigned long [int]、[signed] long [int]
方括号[]里面的内容可以省略不写。
浮点数家族
float
unsigned、signed都可以修饰。
double
unsigned和signed都可以修饰。
构造类型(详情可见我已更新blog)
数组类型
结构体类型 struct
枚举类型 enum
联合体类型 union
指针类型(详情可见我已更新blog)
int* pi;
char* pc;
float* pf;
void* pv;
空类型
void 表示空类型(无类型)
通常应用于函数的返回类型、函数的参数、指针类型等。
原码、反码、补码
整型的二进制表示:
原码、反码、补码
正整数的原码、反码、补码相同!!!
int类型大小是4个字节,可以存放32个bit位,即存放32个二进制数。
一个bit位存放一个二进制数。
最高位bit位是符号位。
符号位是0,表示正数。
符号位是1,表示负数。
unsigned int 没有符号位。
对于负数来说
反码 等于 原码符号位不变,其他位取反。
补码 等于 反码 + 1。
整数在计算机里用的是补码储存,整数计算也是用补码计算。
用原码计算会出现错误!
0的原码、反码、补码
0的原码
+0
00000000 00000000 00000000 00000000
-0
10000000 00000000 00000000 00000000
0的反码
+0
00000000 00000000 00000000 00000000
-0
11111111 11111111 11111111 11111111
0的补码
+0和-0都只有一种表示
00000000 00000000 00000000 00000000
负数的原码和补码的互相转换
原码->补码
①除符号位,其他位取反。
②加1
补码->原码
方法一:
①减1
②除符号位取反
方法二:
①除符号位取反
②加1
原码的取值范围和最值
如果有n位二进制数,则最大正数为-1(01111111 11111111 11111111 11111111)原码形式,
减1是因为+0占了一个数的位置(00000000 00000000 00000000 00000000)原码形式。
最小负数-(-1)(11111111 11111111 11111111 11111111)原码形式,
减1是因为-0占了一个数的位置(10000000 00000000 00000000 00000000)原码形式。
取值范围 -(-1)~ (-1)
反码类似原码,在这就不多说了。
补码的取值范围和最值
如果有n位二进制数,则最大正数为-1(01111111 11111111 11111111 11111111)补码形式,
减1是因为0占了一个数的位置(00000000 00000000 00000000 00000000)补码形式。
如果有n位二进制数,则最小负数为-(10000000 00000000 00000000 00000000)补码形式。
取值范围 -()~ (-1)
大小端存储方式
什么是大端小端:
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址 中;小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地 址中。
为什么有大端和小端:
为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8 bit 。但是在 C 语言中除了 8 bit 的 char 之外,还有 16 bit 的 short型, 32 bit 的 long 型(要看具体的编译器),另外,对于位数大于 8 位的处理器,例如 16 位或者 32 位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将 多个字节 安排的问题。因此就导致了大端存储模式和小端存储模式。例如:一个 16bit 的 short 型 x ,在内存中的地址为 0x0010 , x 的值为 0x1122 ,那么 0x11 为高字节, 0x22 为低字节。对于大端模式,就将 0x11 放在低地址中,即 0x0010 中, 0x22 放在高地址中,即 0x0011 中。小端模式,刚好相反。我们常用的 X86 结构是小端模式,而 KEIL C51 则为大端模式。很多的ARM , DSP 都为小端模式。有些 ARM 处理器还可以由硬件来选择是大端模式还是小端模式。
int a = 1;//换算成二进制补码就是 00000000 00000000 00000000 00000001
大端存储
这个图中a和b变量存储的数是二进制补码形式,图中被红色方框框住的数是补码转化为十六进制的数。运行环境是VS2013,不难看出VS采用的是小端存储模式。
大小端本质
一个数值的多个字节在地址中存储的顺序不同!!!
如果你喜欢这篇文章,那就点赞收藏走起来吧!!!