整形在内存中存储
程序员文章站
2022-04-22 12:08:09
...
一个变量的创建是要在内存中开辟空间的,空间的大小是根据不同的类型而决定的;
我们知道创建一个整形需要分配4个字节的空间,那它是如何让存储的呢?
通过学习,我们知道对于整形来说:数据存放内存中其实存放的是补码。
先来了解一下源码,反码,补码。
源码:直接将二进制按照正负数的形式翻译成二进制就可以。
反码:将源码符号位不变,其他位依次按位取反。
补码:反码+1。
看代码
#include<stdio>
int main()
{
int a=10;
int b=-20;
}
a的地址 10的十六进制为00 00 00 0a
b的地址 -20的十六进制为ff ff ff ec
我们发现了顺序有点不对劲。
这是为什么?
大小端介绍
什么是大端、小端?
大端模式:是指数据的低位保存在内存的高地址中,而数据中的高位保存在内存的低地址中。
小端模式:是指数据的低位保存在内存的低地址中,而数据中的高位保存在内存的高地址中。
所以,10、-20都是低地址放在数据的高位;所以为小端存储模式。
设计一个小程序判断当前机器的字节序。
#include<stdio.h>
int check_sys()
{
int i = 1;//1为大端,0为小端
return (*(char*)& i);
}
int main()
{ int a = 10;
int ret = check_sys();
if (ret == 1)
{
printf("小端");
}
else
{
printf("大端");
}
return 0;
}
练习:以下程序输出多少?
#include<stdio.h>
int main()
{
int i = -20;
unsigned int j = 10;
printf("%d\n", i + j);
return 0;
}
//10000000 00000000 00000000 00010100 -20的源码
//11111111 11111111 11111111 11101011 -20的反码
//11111111 11111111 11111111 11101100 -20的补码
//00000000 00000000 00000000 00001010 无符号10的源码,补码,反码
//11111111 11111111 11111111 11110110 -20+10的补码
//11111111 11111111 11111111 11110101 -20+10的反码
//10000000 00000000 00000000 00001010 -20+10的源码
下一篇: vs大小端验证
推荐阅读
-
mysql中游标在存储过程中的详细用法_MySQL
-
详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
-
在内存储器小于文件大小的情况下,大文件中快速查找定位一行
-
在使用angular4中出现JavaScript内存溢出问题(详细教程)
-
在Oracle中不通过存储过程一次执行多条SQL语句Oracle PL/SQL
-
在ASP中调用存储过程的几种方法
-
Zend Framework实现将session存储在memcache中的方法_PHP
-
如何让你的内存中的 NoSQL 数据存储适合企业级应用
-
字符型数据在内存中的存储形式是什么
-
在Winform框架界面中改变并存储界面皮肤样式的方法