如何用c语言输出地址的内容,如下所示:

我通过debug查看了一段地址的内容如下:FFFF:0100E101D5004402AE01-E101E10149024902....D.......I.I.FFFF:0... 我通过debug查看了一段地址的内容如下:

FFFF:0100 E1 01 D5 00 44 02 AE 01-E1 01 E1 01 49 02 49 02 ....D.......I.I.
FFFF:0110 7B 02 E1 01 E1 01 B5 02-DB 02 E1 01 01 03 E1 01 {...............
FFFF:0120 E1 01 30 03 E1 01 E1 01-E1 01 E1 01 E1 01 66 03 ..0...........f.
FFFF:0130 0B E1 01 E1 01 E1 01 D5-00 83 03 AB 03 E1 01 E2 ................
FFFF:0140 03 EA 03 EA 03 CB 03 0A-E1 01 E1 01 E1 01 D5 00 ................
FFFF:0150 D5 00 AE 01 E1 01 E1 01-D5 00 D5 00 E3 06 E8 05 ................
FFFF:0160 00 AA E2 FA F8 C3 8A 26-06 01 32 C0 86 06 0C 00 .......&..2.....
FFFF:0170 0A C0 75 2A CD 16 0B C0-74 EC 3D 00 72 75 04 B0 ..u*....t.=.ru..

现在我想把FFFF:1070~FFFF:017F的内容以两种方式输出来,输出形式为:
/*******************************************************************************************
输出方式一:0170 0A C0 75 2A CD 16 0B C0-74 EC 3D 00 72 75 04 B0
输出方式二:..u*....t.=.ru..
press any key to contiune!
*******************************************************************************************/

请直接在我的这个程序上改:

#include<stdio.h>

void main(){
char *p = NULL;
p = (char *) ((long *)0x13F5C);
printf("%c",p);
}
一楼的,你那个我不需要运行就知道你的不太合理了,段地址+偏移地址都没计算就那样?
展开
 我来答
匿名用户
2011-04-15
展开全部
数在内存中结构。
下面引用一下百度知道里面搜到的内容来方便说明:
===================
来源:

谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。那么究竟什么是big endian,什么又是 little endian呢?

其实big endian是指低地址存放最高有效字节(MSB),而little endian则是低地址存放最低有效字节(LSB)。

用文字说明可能比较抽象,下面用图像加以说明。比如数字0x12345678在两种不同字节序CPU中的存储顺序如下所示:

Big Endian

低地址 高地址
----------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 12 | 34 | 56 | 78 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Little Endian

低地址 高地址
----------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 78 | 56 | 34 | 12 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
===================
C语言中float,double等类型,在内存中的结构
来源:
从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以double能存储更

高的精度。

任何数据在内存中都是以二进制(0或1)顺序存储的,每一个1或0被称为1位,而在x86CPU上一个字节是8位。比如一个16位(2

字节)的short int型变量的值是1000,那么它的二进制表达就是:00000011 11101000。由于Intel CPU的架构原因,它是按字节倒

序存储的,那么就因该是这样:11101000 00000011,这就是定点数1000在内存中的结构。

目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,用符号、指数和

尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。下面是具体的规格:

````````符号位 阶码 尾数 长度
float 1 8 23 32
double 1 11 52 64
临时数 1 15 64 80

由于通常C编译器默认浮点数是double型的,下面以double为例:
共计64位,折合8字节。由最高到最低位分别是第63、62、61、……、0位:
最高位63位是符号位,1表示该数为负,0正;
62-52位,一共11位是指数位;
51-0位,一共52位是尾数位。

按照IEEE浮点数表示法,下面将把double型浮点数38414.4转换为十六进制代码。
把整数部和小数部分开处理:整数部直接化十六进制:960E。小数的处理:
0.4=0.5*0+0.25*1+0.125*1+0.0625*0+……
实际上这永远算不完!这就是著名的浮点数精度问题。所以直到加上前面的整数部分算够53位就行了(隐藏位技术:最高位的1

不写入内存)。
如果你够耐心,手工算到53位那么因该是:38414.4(10)=1001011000001110.0110101010101010101010101010101010101(2)
科学记数法为:1.001……乘以2的15次方。指数为15!
于是来看阶码,一共11位,可以表示范围是-1024 ~ 1023。因为指数可以为负,为了便于计算,规定都先加上1023,在这里,

15+1023=1038。二进制表示为:100 00001110
符号位:正—— 0 !
合在一起(尾数二进制最高位的1不要):
01000000 11100010 11000001 11001101 01010101 01010101 01010101 01010101
按字节倒序存储的十六进制数就是:
55 55 55 55 CD C1 E2 40

===================
我们普遍使用的Intel x86系列的CPU的PC机上运行的程序是采用little endian方式存储数据。
以x为上面例子中的38414.4为例来说明:
问题中经int型(4个字节)指针变量p取得x的地址后,*p的值就是从低地址开始的前四个字节组成的int型变量:0x55555555。
再赋值给double型的y,那么y的值就是以0x55555555为整数部分的浮点数了。

x = 100.1的情况可以在VC上查看内存得到其在内存中的值,低地址开始的四个字节是 66 66 66 66,所以*p = 0x66666666 = 1717986918。以%f的格式控制符打印输出的小数部分保留6位有效数字,并且禁止以指数形式输出浮点数,所以结果就是:
1717986918.000000
另外,虚机团上产品团购,超级便宜
我是百人敌
2011-04-14 · TA获得超过358个赞
知道小有建树答主
回答量:310
采纳率:0%
帮助的人:265万
展开全部
lz,最好用汇编来读取地址内容并通过C语言输出。因为你不知道指针的值究竟代表什么含义,只能在汇编中用es + si来读取
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tattackor
2015-10-28 · TA获得超过3.5万个赞
知道大有可为答主
回答量:5083
采纳率:94%
帮助的人:854万
展开全部
1、%p 直接用16进制地址形式输出地址
%d 把地址直接用10进制形式输出
char a[] = "hellow C++";
int b[] = {0x01,0x02,4,0x08,0};

2、例如下面几种输出地址方法:
printf("十进制地址%d 十六进制地址%p", a, a);
printf("十进制地址%d 十六进制地址%p", b, b);
printf("十进制地址%d 十六进制地址%p", &a[0], &a[0]);
printf("十进制地址%d 十六进制地址%p", &b[0], &b[0]);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2011-04-11
展开全部
#include<stdio.h>

void main(){
char *p = NULL;
printf("0170: ");
for (p = (char *) ((long *)0x100160);p<=(char *)0x10016F;p++)
printf("%X ",*p);
putchar('\n');
for (p = (char *) ((long *)0x100160);p<=(char *)0x10016F;p++)
printf("%c",*p);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
C_stu
2011-04-15 · TA获得超过456个赞
知道小有建树答主
回答量:694
采纳率:0%
帮助的人:622万
展开全部
%x
%s
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式