惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threat Research - Cisco Blogs
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
月光博客
月光博客
V
Vulnerabilities – Threatpost
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
S
Secure Thoughts
Microsoft Azure Blog
Microsoft Azure Blog
Blog — PlanetScale
Blog — PlanetScale
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
T
Tailwind CSS Blog
S
SegmentFault 最新的问题
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
云风的 BLOG
云风的 BLOG
The Last Watchdog
The Last Watchdog
L
LINUX DO - 热门话题
酷 壳 – CoolShell
酷 壳 – CoolShell
WordPress大学
WordPress大学
AWS News Blog
AWS News Blog
美团技术团队
G
Google Developers Blog
宝玉的分享
宝玉的分享
www.infosecurity-magazine.com
www.infosecurity-magazine.com
C
CXSECURITY Database RSS Feed - CXSecurity.com
Recent Commits to openclaw:main
Recent Commits to openclaw:main
I
InfoQ
小众软件
小众软件
Google DeepMind News
Google DeepMind News
P
Privacy & Cybersecurity Law Blog
Stack Overflow Blog
Stack Overflow Blog
Webroot Blog
Webroot Blog
D
DataBreaches.Net
IT之家
IT之家
PCI Perspectives
PCI Perspectives
人人都是产品经理
人人都是产品经理
Hacker News: Ask HN
Hacker News: Ask HN
L
LangChain Blog
SecWiki News
SecWiki News
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cisco Blogs
T
Threatpost
P
Proofpoint News Feed
Y
Y Combinator Blog
Cloudbric
Cloudbric
T
Tor Project blog
量子位
博客园_首页
B
Blog
Hugging Face - Blog
Hugging Face - Blog
GbyAI
GbyAI
D
Darknet – Hacking Tools, Hacker News & Cyber Security

博客园 - 空气

没有不可能的事情 迅景如梭,旧游似梦,烟水程何限 [转]一些web开发中常用的、做成cs文件的js代码 数类 MBTI职业性格测试 Which Programming Lanuguage Are You? 好久没来了。。。 第七章: 封装 - 空气 - 博客园 C/C++中的内存管理 经典正则表达式 二叉树的显示 软件工厂的考试题目程序 第六章: 字符串 测试-通过Word 2007发布Blog 第五章: 数组 第四章: 从 autoboxing 和 unboxing 认识对象 第三章: 语法入门 1. 让自己习惯C++ 0. 序
如何解释内存中的内容
空气 · 2007-05-06 · via 博客园 - 空气

源自《代码大全》第二版,13.1节。(P324)

又加入了一些自己原创的东西。

如何解释内存中某个位置的内容,是由指针的基类型决定的。如果某个指针指向整数,这就意味着编译器会把该指针所指向内存位置的数据解释为一个整数。当然,你可以让一个整数指针,一个字符串指针和一个浮点数指针都指向同一个内存位置。但是其中(至多)只有一个指针能正确的解释该位置的内容。

内存并不包含任何与之相关联的内置解释。只有通过使用一个特定类型的指针,一个特殊位置的比特才能解释为有意义的数据。

例如对于内存地址:

以如下的观点分别可以解释为:

四字节的整数:        1667391754

双字节的整数:        24842

四字节的浮点数:    4.17595656202980E+0021

字符(串):        (换行符) abc

下面的程序演示了各种解释:

#include <iostream>

using namespace std;

int main()

{

    int a = 1667391754;

    int *p_int = &a;

    cout << "四字节整数:\t" << *p_int << endl;

    short *p_short = (short*)p_int;

    cout << "双字节整数:\t" << *p_short << endl;

    float *p_float = (float*)p_int;

    cout << "双字节浮点数:\t" << *p_float << endl;

    char *p_char = (char*)p_int;

    cout << "字符串:\t" << p_char << endl;

    return 0;

}

运行结果:(VC++6.0)

四字节整数: 1667391754

双字节整数: 24842

四字节浮点数: 4.17596e+021

字符串:

abc?

Press any key to continue

下面分别说说计算机是怎样用不同的观点解释数据的。

预备知识:

    数制。内存中是以二进制的方式存储数据的,每个二进制数字占一个位(bit)。上面的表格中每个格子代表一个字节,也就是8个位,而其中的数字(如0A)则是十六进制的表示。2位的十六进制数字可以转化为8位的二进制数字。

    字节排序:要明确的是这里的字节排序方式是"大数在先"的。也就是说将最高有效字节存于最低数值的字节地址中。

四字节整数:

    这里的最高有效字节存于最低数值的字节地址中,所以内存应解释为: 63 62 61 0A。把它们连起来看成一个十六进制的数字,再转化为十进制,就可以得到1667391754。

二字节整数:

    计算机先找到所需要的内存总量(两字节),之后按照大数在先的方式解释,得到 61 0A。同样的,把十六进制转化为十进制,得24842。

四字节浮点数:

    浮点数的解释比较复杂。现在计算机所用的浮点表示法为IEEE标准。对于单精度的浮点数(即四字节浮点数,共32位),第一个位表示符号,后面8个位表示阶码,最后23位表示尾数。在这个例子中,内存中数据为:(即0A 61 62 63的二进制)

01100011 01100010 01100001 00001010

    符号位 0 ,表示这是一个正数。

    8位阶码,11000110,变为十进制是198,减去指数偏移量127得到实际的指数 71。

    后面的23位尾数则是实际的数字内容。按照IEEE标准,它应该被解释为二进制的 1. 1100010 01100001 00001010。

    把上面的合起来,得到 + 1. 1100010 01100001 00001010 * 2^71.即十进制的 4.17596e+021

字符串:

    按照ASCII码来解释。0A,换行符,61 62 63分别是字母a,b和c。