目录
1.大端存储与小端存储
大端存储:把一个数据的低位字节的内容,存放在高地址处,把一个数据的高位字节的内容存放在低地址处
小端存储:把一个数据的低位字节的内容,存放在低地址处,把一个数据的高位字节的内容存放在高地址处
2.二进制,原码,反码,补码.
正数的原码反码补码相同,下面是负数的原码反码补码之间的转换
原码:直接将数值按照正负数的形式翻译成二进制就可以得到原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1得到了补码。
以10和-10为例,下面是他们的原码反码补码
接下来继续探究数据是以什么形式存放的
3.数值的存储方式
本质上内存中存放的是二进制,vs为了方便显示,以十六进制的方式显示的
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int a = 10;
int b = -10;
return 0;
}
创建整形变量,一个整型变量有四个字节,用32个比特位存储
按下F10进入调试,在窗口中打开内存,观察a,b的值
上面这是a存储的内容 0a 00 00 00
上面这是b存储的内容 f6 ff ff ff
再将上面a的补码转化为十六进制:00 00 00 0a
b的补码转化为十六进制: ff ff ff f6
不难发现,vs中a,b存储的数据分别是他们的十六进制,但是顺序比较奇怪(参考上方小端,大端存储),是十六进制的逆序
逆序是因为在vs中采取的是小端字节序存储
所以我们的得出了结论:在计算机系统中,数值是以二进制补码的形式存储的。
4.如何写个程序用一段代码来判断大小端
定义一个整型变量a=1;它的十六进制表示方式如上图所示
a的大小端表示如下图所示:
观察两者区别小端存储的01放在前面,大端存储的0放在后面,此时我们可以巧妙的将
a的地址取出来,此时&a为int*类型,当我们将int*类型强制转化为char*类型后,再进行解引用,就可以访问到第一个字节的内容。
&a-->(char*)&a-->*(char*)&a
如此操作之后,如果得到的值是1那么就说明是小端存储,若为0则是大端存储,上代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int a = 1;
int ret = *((char*)&a);
if (ret == 1)
{
printf("小端输出");
}
else
{
printf("大端输出");
}
return 0;
}
可以看到在vs上数据存储是小端存储
5.无符号类型,有符号类型
unsigned int a 定义一个无符号的整型a
无符号类只针对整型
有符号 short==signed short,无符号unsigned short
但是在c语言中并无规定char代表unsigned char还是signed char
有符号的short类型,有1个符号位,15个数值位
但无符号的short类型,有0个符号位,16个数值位
无符号型,11111111的计算结果是255
有符号型,11111111的计算结果是-128
signed char的范围是 -127~128,如图
无符号型,11111111的计算结果是255
有符号型,11111111的计算结果是-128
unsigned char的范围是0~255
signed char类型数值的变化可用下图生动表示出来
而对于unsiged char类型的数值变换则可用下图表示
创作不易,留下你的赞吧