栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

字节数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 01
	return (*(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。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/744203.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号