指针定型
Pointers typecast
我有以下代码,我想知道为什么我有以下输出:
#include <iostream>
int main() {
double nValue = 5;
void *pVoid = &nValue;
short *pInt = static_cast<short*>(pVoid);
std::cout << *pInt << std::endl;
return 0;
}
它输出给我'0'。我想知道为什么会这样。谢谢你!
你有UB(未定义行为),因为你违反了指针混叠规则。这意味着任何事情都可能发生。
例如,编译器有权期望short*
永远不会引用double
对象,因此它几乎可以按照自己的意愿解释*pInt
。
也有可能编译器按字面意思解释代码,而在您的平台上,5.0
的二进制表示以两个(或sizeof(short)
)字节的零开始。
您正在将double
数据的内存块转换为short
。由于您在该块中存储了一个小值,因此它不会存储在第一个位中。因此,首先bits
为零。但是它依赖于内部double
表示和short
大小,所以不能保证在不同的平台上是相同的
您试图将double
的内容解释为short
。这会调用未定义的行为——您的程序可以自由地做任何事情。
pVoid
指向一个表示double
的位模式。一旦使用了void*
,编译器就会丢失类型信息。当将void*
转换为short*
时,您声称指向的位模式是short
,实际上不是。short
和double
在内存中的表示是完全不同的。当对pInt
解引用时,该位置的内存恰好为0。此时,编译器不再知道该值的类型是否真的是double
,因此,如果您希望这样做,则不可能进行隐式转换。
只是为了好玩,在你的机器上5的双表示形式很可能是这样的
*double = (5)
0000000000000000000000000000000000000000000000000000000000000101
^^^^^^^^^^^^^^^^
*short = (0)
这应该会告诉你为什么会发生这种情况
int main() {
double nValue = 5;
short nValue_short = 5;
std::bitset<sizeof(double)*8> bit_double(nValue);
std::bitset<sizeof(short)*8> bit_short(nValue_short);
std::cout << bit_double << std::endl;
std::cout << bit_short << std::endl;
return 0;
}
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- 指针定型