目录
1.整型类型中的成员
2.整型在内存中的存储
2.1原码,反码,补码
2.2整型在内存中以补码存放数据
2.3大小端
2.3.1大小端的介绍
2.3.2通过编程判别当前机器的字节序
1.整型类型中的成员
(unsigned为无符号类型,signed为有符号类型)
1.char
unsigned char
signed char
2.short
unsigned short [int](int可以省略不写,以下相同)
signed short [int]
3.int
unsigned int
signed int
4.long
unsigned long [int]
signed long [int]
Q.整型有这么多分类,每一个类型还分无符号和有符号,那我们平时写的int,short,char到底是什么呢?
A.我们平时所写的int,short,long都是有符号的,即分别为:signed int,signed short,signed long。而char则取决于寄存器的不同而不同,但绝大多数的char所代表的是signed char
Q.char不是字符吗?为什么char会放入到整型类型中呢?
A.这就和我们本文章所讲到的存储有关,char类型在内存中以ASCII值存储,ASCII值也是整数,所以归纳到整型分类中。
2.整型在内存中的存储
一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的
2.1原码,反码,补码
计算机中的整数有三种2进制的表达方式,分别为原码,反码和补码。三种表示方法均有符号位和数值位两部分组成,符号位用‘0’表示‘正数’,用‘1’表示‘负数’。
正数的原码,反码和补码均相同
负数的三种表达方式均不相同
原码:将整数以二进制的形式所转换,即为原码
//举例//
整数:-20
原码:10000000 00000000 00000000 00010100
反码:将原码的符号位不变,其他位依次取反就可以得到反码
//举例//
整数:-20
原码:10000000 00000000 00000000 00010100
反码:11111111 11111111 11111111 11101011
补码:将反码+1就可以得到补码
//举例//
整数:-20
原码:10000000 00000000 00000000 00010100
反码:11111111 11111111 11111111 11101011
补码:11111111 11111111 11111111 11101100(二进制位,满2进1)
2.2整型在内存中以补码存放数据
先让我们来看看在内存中的存储:
以整数a = -20;来举例
a = -20
补码:11111111 11111111 11111111 11101100
内存中的存储形式(以十六进制显示)
由以上的图我们可以知道,整数在内存中确实以补码的形式存储,而且我们发现了他顺序却有点不对劲,是和我们的补码顺序所相反的。
这就引申到我们的下一小节,大小端的介绍了
Q. 在此之前还有一个问题,为什么在计算机系统中一律以补码的形式存储呢?
A.使用补码,可以将符号位和数值域统一处理。同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
在计算机中,计算1 - 1其实是1 + (-1),因为CPU只有加法器,那么到底是怎么实现的呢?
参照以下图,可以大概了解一下。
2.3大小端
2.3.1大小端的介绍
大端(大端字节序)模式:是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。
小端(小端字节序)模式:是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。
对于一个整数的低位和高位区分:
例如a = 123
个位(低):3 十位:2 百位(高):1
二进制:(高位)00000000 00000000 00000000 01111011(低位)
《———————————————————
二进制从右边第一位开始为1*2^0 + 1*2^1来组成个位。显然,二进制从右边开始为低位到左边为高位
(图片下方为小端字节序,不好意思打错字了)
可以看到, 我目前的机器为小端字节序
2.3.2通过编程判别当前机器的字节序
我们想要判别大小端,主要是看他字节序是低位放在低地址还是放在高地址来进行判别是小端还是大端。
那我们该怎么只拿取他的第一个字节呢?
先取地址,&a。但&a是四个字节,我们可以通过强制类型转换,使用char*类型(char*类型只占1个字节)就可以获取他的第一个字节了,再通过对第一个字节的判别来进行大小端的区分就可以咯【代码在下方】
#include <stdio.h>
int main()
{
int a = 1;
char* p = (char*)&a;
if (*p == 1)
{
printf("小端字节序\n");
}
else
{
printf("大端字节序\n");
}
return 0;
}
结合文章上的分析,结果是正确的。