关于指针取地址,数据进制转换

岸边青蛙 2017-11-01 03:24:22
double m;
m= *(double*)(指针地址-0x10);

大神,如上所示,0x10是16进制的,如果替换成一个变量,而变量是10进的。该如何如理? (注:简单的将10进制数转成16进制,因为没有加0x,减出来的效果还是10进制的效果。。。)请大神赐教 赐教。
...全文
396 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2017-11-03
  • 打赏
  • 举报
回复
为什么不用指针:
double *pdbl = (double *)dwValue;
for (int i = 0; i < 1000; i++)
{
	Item.data1[i] = *(--pdbl);
	TRACE(_T("A = %4.2f"), Item.data1[i]);
}
red-fly 2017-11-03
  • 打赏
  • 举报
回复
dwValue是个什么东西?
赵4老师 2017-11-02
  • 打赏
  • 举报
回复
Pointer Arithmetic Additive operations involving a pointer and an integer give meaningful results only if the pointer operand addresses an array member and the integer value produces an offset within the bounds of the same array. When the integer value is converted to an address offset, the compiler assumes that only memory positions of the same size lie between the original address and the address plus the offset. This assumption is valid for array members. By definition, an array is a series of values of the same type; its elements reside in contiguous memory locations. However, storage for any types except array elements is not guaranteed to be filled by the same type of identifiers. That is, blanks can appear between memory positions, even positions of the same type. Therefore, the results of adding to or subtracting from the addresses of any values but array elements are undefined. Similarly, when two pointer values are subtracted, the conversion assumes that only values of the same type, with no blanks, lie between the addresses given by the operands.
Jobobo 2017-11-02
  • 打赏
  • 举报
回复
你的问题可能出在dwValue了,这个dwValue是什么类型的?如果是double型的指针,每次减1内存地址会自动跳过一个double类型的长度,按照你的程序所要表达的意思,你的dwValue应该是一个char型的指针才正确,如果是double型指针就不需要使用i*8了,直接用i就可以。

void Test()
{
	double data[10] = { 1,2,3,4,5,6,7,8,9,10 };
	double* pData1 = &data[9];
	char* pData2 = (char*)(data + 9);
	double data1[10];
	double data2[10];
	for (int i = 0; i < 10; i++)
	{
		data1[i] = *(double*)(pData1 - i);
		data2[i] = *(double*)(pData2 - i * 8);
		printf("data1[%d]=%4.2f\t\t", i, data1[i]);
		printf("data2[%d]=%4.2f\n", i, data2[i]);
	}
}
Jobobo 2017-11-02
  • 打赏
  • 举报
回复
引用 9 楼 jz_bigsea 的回复:
是的,可是楼上的问题核心不是这个。从1开始也好,问题在于变量是10进制的。 10进制的16取出来的效果不是0x10要的结果。。。。。
重申一遍,变量是不分十进制和十六进制的,你申请一个int型变量,可以在初始化的时候以十进制方式赋给它16,也可以在初始化的时候以十六进制的方式赋给它0x10,这两种赋值方式是等价的,它们在内存中存储的时候都是0000 0000 0000 0001 0000 0000 0000 0000(以32位整型为例,当然内存中高位和地位是反的,这里就不反了,便于理解),所以说不论是什么进制,只是内存中一个数值的表现方式,而实际在内存中都是以二进制方式保存,它们本质上是一样的,不知道你还在纠结什么? 如果还有问题,你可以写得详细些,我实在不能理解“10进制的16取出来的效果不是0x10要的结果。。。。。”这句是什么意思,什么叫做效果?
frequent 2017-11-02
  • 打赏
  • 举报
回复
地址之间,乃至是所有数值类型间,在内存中其实是并没有十进制和十六进制区别的,只有将数字转换为字符串后,才存在十进制和十六进制的区别,也就是只有字符串上才存在进制的区别。
schlafenhamster 2017-11-01
  • 打赏
  • 举报
回复
m= *(double*)(指针地址-x10); "指针地址" 是什么指针的地址? -0x10(-16) 是减多少? 是 16 个 double ? 是 16 个 BYTE ? 仔细看看 应该 怎么 转换 ! data1[ii]=*(double*)((BYTE*)&data[9]-Test);// point to last !
tomhe666 2017-11-01
  • 打赏
  • 举报
回复
CPU只认二进制。。。。。
岸边青蛙 2017-11-01
  • 打赏
  • 举报
回复
是的,可是楼上的问题核心不是这个。从1开始也好,问题在于变量是10进制的。 10进制的16取出来的效果不是0x10要的结果。。。。。
schlafenhamster 2017-11-01
  • 打赏
  • 举报
回复

void TenDouble()
{
	double data[10]={1,2,3,4,5,6,7,8,9,10};
	double data1[10];
	for(int ii=0;ii<10;ii++)
	{
		int  Test=ii*sizeof(double);
		data1[ii]=*(double*)((BYTE*)&data[9]-Test);// point to last !
		TRACE2("data1[%d]=%4.2f\n",ii,data1[ii]);
	}
data1[0]=10.00 data1[1]=9.00 data1[2]=8.00 data1[3]=7.00 data1[4]=6.00 data1[5]=5.00 data1[6]=4.00 data1[7]=3.00 data1[8]=2.00 data1[9]=1.00 注意 data1[ii]=*(double*)((BYTE*)&data[9]-Test);// point to last !
Jobobo 2017-11-01
  • 打赏
  • 举报
回复
你还是没有明白,和是不是10进制没关系,数据在计算机运行时都是2进制,所谓10进制和16进制都是一种表现形式。 你上面的代码中,第二段只要把i改成从1开始循环就对了。 什么叫做10进制的效果?是不是因为在TRACE(_T("A=%4.2f"),Item.data1[i]);语句中显示的是十进制的值?那这是因为%4.2f就是以10进制的格式显示这个数值啊
Jobobo 2017-11-01
  • 打赏
  • 举报
回复
你的循环第一次就出错了,i从0开始,第一次循环减了0,而不是8
岸边青蛙 2017-11-01
  • 打赏
  • 举报
回复
Item.DEA = *(double*)(dwValue-0x8); Item.DEA0 = *(double*)(dwValue-0x10); Item.DEA1 = *(double*)(dwValue-0x18); Item.DEA2 = *(double*)(dwValue-0x20); Item.DEA3 = *(double*)(dwValue-0x28); Item.DEA4 = *(double*)(dwValue-0x30); Item.DEA5 = *(double*)(dwValue-0x38); Item.DEA6 = *(double*)(dwValue-0x40); 我手工写死这样去取当然是没有问题的, 问题取1000了?要循环,这么干就太low了。 for(int i=0;i<1000;i++) { int Test=i*8; Item.data1[i]=*(double*)(dwValue-Test); TRACE(_T("A=%4.2f"),Item.data1[i]); ; } 这个循环,每次虽然乘8,取的实际上是10进的的效果。。无解了么???????
worldy 2017-11-01
  • 打赏
  • 举报
回复
在内存里,标准类型数据都是16进制的
schlafenhamster 2017-11-01
  • 打赏
  • 举报
回复
double m; int x10=16; m= *(double*)(指针地址-x10);
岸边青蛙 2017-11-01
  • 打赏
  • 举报
回复
楼上的问题也是我没弄明白的问题 (指针地址-16)和(指针地址-0x10)得到的结果后者是正确的,前者取出来的数据不对。。一脸蒙B了。
Jobobo 2017-11-01
  • 打赏
  • 举报
回复
不太清除你的问题,不过不论是10进制还是16进制都只不过是一个数的不同表现方式而已,比如0x10和16,这两个数字是等的,你换成变量,变量在赋值的时候不论是哪个,最后存的也都是一样的值。 当你将10进制数转成16进制时,不加0x,编译器自然认为你操作的是一个10进制数,这就是语法规则,不能说你知道这是16进制就行了,你要让编译器也知道。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧