【发布时间】:2013-06-11 19:18:15
【问题描述】:
我在一个无符号字节数组中收到一个值,我想将其取消引用为浮点数。将 ptr 作为 uint8_t* 指向一个字节数组,其中包含四个值 0,0,0xCD,0x42(这是一个小端系统)。
float val = *(float*)ptr;
返回 -1.34e8
当我输入时:
*(float*)ptr;
在该部分代码中遇到断点后的表达式窗口中,它给了我预期的 102.5。此外,当我输入时:
*(float*)(ptr - 1);
我得到了不正确的 -1.34e8,好像编译器使用 ptr - 1 而不是我输入的内容。
我很困惑 - 我在这里遗漏了什么吗?
【问题讨论】:
-
基本上 deref 是正确的。如果你 printf("%p", ptr);你得到的地址可能不是 4 字节对齐(或至少 2 字节)吗? (这在某些平台上可能是必需的)。顺便说一句,(ptr-1) 向后一个字节(因为它是一个 uint8_t *),而不是通常返回一个浮点大小。
-
是的,这很奇怪。 ptr - 1 向后一个字节,所以就好像我的原始代码 (float)ptr;正在查找一个字节并从那里而不是从 ptr 解释四个浮点字节。我的观点是,当代码在调试器中停止时, (float)ptr 给了我我期望在运行时得到的东西,而 (float)(ptr-1)给了我在运行时实际得到的东西。
-
如果 ptr 值未正确对齐,编译器可能会对其进行舍入。试试 printf("%p", ptr);在源代码中,然后检查结果是否与调试器给您的结果相同(只是在 dbg 中打印指针本身)。
-
另外,为了测试,只需在 uint8_t* 中传递一个真正的浮点值,例如浮动 f = 102.5; yourfunct((uint8_t*)&f);看看这是否有效。
-
我做了 printf,转到内存中的位置并验证它指向第一个 0。这与调试器匹配,但值仍然不同。但我认为这一定是对齐的事情,因为取消引用 ptr + 1 仍然给我相当于 ptr - 1。编译器这样做是正常的,还是这只是 CCS 成为噩梦的另一种情况?
标签: c++ pointers code-composer