【C语言】一.数据的存储(整数&&浮点数在内存中的存储||大小端||原码反码补码)
0x00. 引言
相比其他的博客,本博客就主打一个简单干练,精华萃取。话不多说,直接开搞
0x01. 整数在内存中的存储
我们先来看一个例子
int a=10;
long long b=20;
这里定义了两个变量a和b,从右向左看10赋值给变量a,a的类型是int ,int占四个字节,表明在内存中我们给变量a开辟了四个字节大小的内存空间。同理b被声明为long long类型,在内存中给它分配了8个字节的空间。整数在内存中存的是10的二进制表示吗?
1.原码,反码,补码
整数在内存中存的是补码。不是直接的二进制表示。
原码:即为当前值的二进制表示
反码:符号位(第一位)不变,其他为按位取反(1变0,0变1)
补码:反码加一
值得一提的是正数的原码与补码相同
2.大端字节序/小端字节序
大端字节序(Big Endian)
高位字节数据存放在内存低地址处,低位字节数据存放在内存高地址处。
小端字节序(Little Endian)
高位字节数据存放在内存高地址处,低位数据存放在内存低地址处
举个例子:
例如:int a=1
假设内存地址从左往右由高到低
0x 00 00 00 01 这就是小端字节序,因为01存在了低地址处
而
0x 01 00 00 00 就是大端字节序,因为01存在了高地址处
如何判断一个机器的大小端呢?
int check_sys()
{
int a = 1;
return *(char*)&a;
}
int main()
{
int ret = check_sys();
if (ret == 1)
printf("小端");
else
printf("大端");
return 0;
}
3.一道练习题
int main()
{
char a[1000];
int i;
for ( i = 0; i < 1000; i++)
{
a[i] = -1 - i;
}
printf("%d ", strlen(a));// 255,找到0之前的字符个数 -1到-128,127到0,总计128+127=255
//signed char 取值范围0->127,(-128)->(-1)
//unsigned char 取值范围0->255 10000000
return 0;
}
0x02.浮点数在内存中的存储
背景
事实上直到20世纪80年代, 还是计算机厂商各自为战, 每家都在设计自己的浮点数存储规则, 彼此之间并不兼容. 直到1985年, IEEE754标准问世, 浮点数的存储问题才有了一个通用的工业标准.
IEEE754提供了四种精度规范, 其中最常用的是 单精度浮点型 和 双精度浮点型 , 但IEEE754并没有规定32位浮点数类型需要叫做 float, 或64位浮点数需要叫做 double. 它只是提供了一些关于如何存储不同精度浮点数的规范和标准. 不过一般情况下, 如果我们提到 float, 其实指的就是IEEE754标准中的32位单精度浮点数. 如果我们提到 double, 其实指的就是IEEE754标准中的64位双精度浮点数。
正文
推荐看这篇
知乎大佬的文章
0x03.总结
第一次用markdown编辑器,确实比之前的清晰很多,如果对你有帮助,点个赞再走吧
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!