如何用c语言输出地址的内容,如下所示:
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用c语言输出地址的内容,如下所示:相关的知识,希望对你有一定的参考价值。
我通过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);
一楼的,你那个我不需要运行就知道你的不太合理了,段地址+偏移地址都没计算就那样?
下面引用一下百度知道里面搜到的内容来方便说明:
===================
来源:
谈到字节序的问题,必然牵涉到两大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
另外,虚机团上产品团购,超级便宜 参考技术A lz,最好用汇编来读取地址内容并通过C语言输出。因为你不知道指针的值究竟代表什么含义,只能在汇编中用es + si来读取本回答被提问者采纳 参考技术B 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]); 参考技术C #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);
参考技术D %x
%s
如何用c语言双for循环输出下面图形??
(1)
*
***
*****
*******
(2)
*
***
*****
*******
对一个二维图形的输出,一般可以使用双重循环进行控制输出,其中外层循环控制输出的行数,内存循环输出每行的信息。
对于第1题,参考代码如下:
#include <stdio.h>#include <stdlib.h>
int main(int argc, char*argv[])
int i,j;
int n=4;
for(i=1;i<=n;i++)//控制输出n行
for(j=0;j<2*i-1;j++) //第i行控制输出2*i-1个*
printf("*");
printf("\\n");
system("pause");
return 0;
编译后的运行结果如下:
对于第2题,参考源程序如下:
#include <stdio.h>#include <stdlib.h>
int main(int argc, char*argv[])
int i,j;
int n=4;
for(i=1;i<=n;i++)//控制输出n行
//第i行输出n-i个空格
for(j=0;j<n-i;j++)
printf(" ");
//第i行输出2*i-1个*
for(j=0;j<2*i-1;j++)
printf("*");
printf("\\n");
system("pause");
return 0;
参考技术A #include<stdio.h>
void main()
int i,j;
for(i=1;i<=5;i++)
for(j=0;j<2*i-1;j++)
printf("*");
printf("\n");
没时间,只做了一个 参考技术B int lineNo;
int numCnt;
printf("\n");
for (lineNo = 1; lineNo<= 3; lineNo++)
for (numCnt= 1; numCnt<= (lineNo - 1) * 2 + 1; numCnt++)
printf("*");
printf("\n");
参考技术C #include < stdio.h >
int main()
int i , j , l ;
for( i = 1 ; i <= 5 ; i++ )
for( j = 0 ; j < 2 * i - 1 ; j++ )
printf( "*" );
printf( "\n" );
for( i = 1 ; i <= 5 ; i++ )
for ( l = 5 ; l-i>0 ; l-- )
printf( " " ) ;
for( j = 1 ; j <= 2*i-1 ; j ++ )
printf( "*" ) ;
printf( "\n" ) ;
system( "pause" ) ;
return 0 ;
欢迎采纳!! 参考技术D *
**
***
****
*****
******
*/
/*
int a,b;
for(a=1;a<=6;a++)
for(b=1;b<=a;b++)
printf("*");
printf("\n");
*/
/*
int a,b;
for(a=0;a<6;a++)
for(b=0;b<6-a;b++)
printf("*");
printf("\n");
*/
/* 3:
*
**
***
****
*****
******
*/
/*
int a,b,c;
for(a=1;a<=6;a++)
for(c=5;c>=a;c--)
printf(" ");
for(b=1;b<=a;b++)
printf("*");
printf("\n");
*/
/* 4:
******
*****
****
***
**
*
*/
/*
int a,b,c;
for(a=1;a<=6;a++)
for(c=1;c<=a;c++)
printf(" ");
for(b=6;b>=a;b--)
printf("*");
printf("\n");
*/
//正的等腰三角型 *1
/* int a,b,c;
for(a=1;a<=6;a++)
for(c=7;c>=a;c--)
printf(" ");
for(b=2;b<=a;b++)
printf("*");
for(b=1;b<=a;b++)
printf("*");
printf("\n");
*/
//正的等腰三角型 *2
/*
int a,b,c;
for(a=0;a<=5;a++)
for(c=5;c>=a;c--)
printf(" ");
for(b=1;b<=(2*a)+1;b++)
printf("*");
printf("\n");
*/
//菱形
/*
int a,b,c;
for(a=0;a<=3;a++)
for(c=3;c>a;c--)
printf(" ");
for(b=1;b<=(2*a)+1;b++)
printf("*");
printf("\n");
for(a=0;a<3;a++)
for(c=0;c<=a;c++)
printf(" ");
for(b=5;b>=(a*2)+1;b--)
printf("*");
printf("\n");
*/
//倒的等腰三角型
/*
int a,b,c;
for(a=1;a<=6;a++)
for(c=0;c<=a;c++)
printf(" ");
for(b=11;b>=(a*2)-1;b--)
printf("*");
printf("\n");
*/
/*
******
*****
****
***
**
*
*/
int a,b;
for(a=1;a<=6;a++)
for(b=6;b>=a;b--)
printf("*");
printf("\n");
本回答被提问者采纳
以上是关于如何用c语言输出地址的内容,如下所示:的主要内容,如果未能解决你的问题,请参考以下文章