欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

深度剖析数据在内存中的存储

时间:2023-04-25
字节数1124848类型bytecharshortintlongfloatdouble

在计算机中所有数据都是通过一个个二进制位存储的,单位为(bit)。每八位二进制数(eq:0001 0010)代表一个比特(byte)大小,即1字节=8位。

1.数据类型中,还分为有符号(signed)和无符号(unsigned)类型

只有正数可以放在无符号的变量中,如果是有符号,最高位是0,为正数;最高位是1,为负数。

其中char无法判断是有符号和无符号。char也被划为整形,是因为,虽然是字符类型,但是字符类型存储的时候,存储的是asc码值,asc码值是整数。

2.关于原码,反码,补码

原码:直接将二进制按照正负数的形式翻译成二进制。

反码:将原码的符号位不变,其他位依次按位取反

补码:反码+1

正数的原码,反码,补码都相同。对于整形来说:数据存放内存中其实是补码。

3.关于大小端的介绍

大端存储:将数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中

小端存储:将数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中

举个例子:0x11223344 ,地址从左到右,为由低到高

小端:44 33 22 11

大端:11 22 33 44

那么如何判断是否为大端存储还是小端存储呢?

#include int fuc() {int i = 1; //0x 00 00 00 01return (*(char*)&i); //char只会提取一个字节,所以如果小端存取则会拿出01,否则为00}int main() {int ret = fuc();if (ret == 1) {printf("小端模式");}else {printf("大端模式");}return 0;}

4.练习:

输出的是多少?

int main() {char a = -1;signed char b= -1;unsigned char c= -1;printf("a=%d,b=%d,c=%d", a, b, c);return 0;}

a=-1,b=-1,c=255

解析:

-1的原码1000 0000 0000 0000 0000 0000 0000 0001

反码:1111 1111 1111 1111 1111 1111 1111 11110

补码:1111 1111 1111 1111 1111 1111 1111 1111 

又因为前面是char,所以只取8位,即:1111 1111。但打印的时候%d,导致a整型提升,最高位为1,所以补24位1,为补码,这时候打印的仍为-1,同理b。

而c:发生整型提升,无符号,高位补0,0000 0000 0000 0000 0000 0000 1111 1111转换为十进制为255。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。