先看看下面的代码:
我们看到不管是int型的 i 还是float型的 f ,经过reinterpret_cast<char*>(&addr)的转换后,输出都是"1234"
这是因为整型的875770417和单精度浮点型的0.00000016688933,在内存中的数据表示从低位到高位依次是0x31 0x32 0x33 0x34。
数据的表示是相同,你把它当int型数据来看,他就是875770417;你把它当float型数据来看,它就是0.00000016688933,关键就是看编译器怎么来解释数据,也就是语义表达的问题。
所以reinterpret_cast<char*>的转换就是不理会数据本来的语义,而重新赋予它char*的语义。有了这样的认识有以后,再看看下面的代码就好理解了。
输出的是875770417(0x34333231,注意高低位),就是上面的逆运算,好理解吧。
再看一个诡异的。
pi指向哪里?指向CData类型数据data的内存地址偏移2个字节。也就是说指向CData::val1和CData::val2的中间。这不是乱指嘛!没错,就是乱指,我们仍然看到输出数据显示875770417。
也就是说只要是个地址,reinterpret_cast都能转,不管原来数据是啥,甚至不是一个数据的开始。所以,请正确的使用它,用你希望的方式。
转至:http://blog.csdn.net/coding_hello/archive/2008/03/24/2211466.aspx
#include <iostream> using namespace std; void main() { int i = 875770417; cout<<i<<" "; char* p = reinterpret_cast<char*>(&i); for(int j=0; j<4; j++) cout<<p[j]; cout<<endl; float f = 0.00000016688933; cout <<f<<" "; p = reinterpret_cast<char*>(&f); for(j=0; j<4; j++) cout<<p[j]; cout<<endl; }
我们看到不管是int型的 i 还是float型的 f ,经过reinterpret_cast<char*>(&addr)的转换后,输出都是"1234"
这是因为整型的875770417和单精度浮点型的0.00000016688933,在内存中的数据表示从低位到高位依次是0x31 0x32 0x33 0x34。
数据的表示是相同,你把它当int型数据来看,他就是875770417;你把它当float型数据来看,它就是0.00000016688933,关键就是看编译器怎么来解释数据,也就是语义表达的问题。
所以reinterpret_cast<char*>的转换就是不理会数据本来的语义,而重新赋予它char*的语义。有了这样的认识有以后,再看看下面的代码就好理解了。
#include <iostream> using namespace std; void main() { char* p = "1234"; int* pi = reinterpret_cast<int*>(p); cout<<*pi<<endl; }
输出的是875770417(0x34333231,注意高低位),就是上面的逆运算,好理解吧。
再看一个诡异的。
#include <iostream> using namespace std; class CData { public: CData(int a, int b) { val1 = a; val2 = b; } private: int val1; int val2; }; void main() { CData data(0x32313536, 0x37383433); int* pi = reinterpret_cast<int*>((char*)&data + 2); cout<<*pi<<endl; }
pi指向哪里?指向CData类型数据data的内存地址偏移2个字节。也就是说指向CData::val1和CData::val2的中间。这不是乱指嘛!没错,就是乱指,我们仍然看到输出数据显示875770417。
也就是说只要是个地址,reinterpret_cast都能转,不管原来数据是啥,甚至不是一个数据的开始。所以,请正确的使用它,用你希望的方式。
转至:http://blog.csdn.net/coding_hello/archive/2008/03/24/2211466.aspx
发表评论
-
const 与static 关键词在c 和 c++中的作用
2012-08-11 11:49 998一.C语言中的const ... -
error LNK2005 and error LNK2019
2012-08-09 23:08 1174error LNK2005 and error LNK2019 ... -
LIBCD.lib(crt0dat.obj) : error LNK2005: _exit already defined in msvcrtd.lib(MSV
2012-08-07 09:20 1442LIBCD.lib(crt0dat.obj) : error ... -
在VS2010下配置VC++ Directories
2012-08-07 08:29 10981:可以 在“class View” 面板 -> 右 ... -
零星笔记,待整理
2010-11-01 13:00 510//用 getline 函数从输入读取整行内容。然后为 ... -
VC: error LNK2019:unresolved external symbol *** referenced in function ***的解决方案
2010-10-30 21:13 2140当头文件中声明了一个函数,但是在相应的源文件中却没有对该函数进 ... -
stdcall cdecl fastcall thiscall naked call的具体含义
2010-10-30 18:54 983在C语言中,假设我们有 ... -
#define总结 (网上资料汇集)
2010-10-30 08:06 7441. 定义简单的常数:定义常量,便于修改(切不可在后面加上分号 ... -
(zz)编译与使用Qt4,Visual Studio Express 2008
2010-10-14 22:35 1409一、Qt版本 我现在用的是4.5.2。好像前段时间4.6出来 ... -
strcat 内部实现
2010-09-21 00:43 1828char * strcat(char * dest, ... -
deep copy & shallow copy
2010-09-15 19:27 851A shallow copy of an object cop ... -
C++ 经典书籍
2010-09-14 16:18 1723下载地址: http://www.51cnnet.net/di ... -
内存对齐的规则以及作用
2010-09-14 00:14 708首先由一个程序引入话 ... -
[转]C++ reinterpret_cast,const_cast等 显式类型转换总结
2010-09-13 23:23 1053#include<iostream.h> ... -
C++提供了四种新的类型强制
2010-09-13 23:13 719static_cast const_cast reinte ... -
C++著名程序库的比较和学习经验
2010-09-13 19:30 8611、C++各大有名库的介绍——C++标准库 2、C++各大有名 ... -
c++ library and resource List
2010-09-13 18:56 9291,前言 无数次听 ... -
C++中操作符operator的两种用法
2010-09-12 02:23 11481.operator overloading C++可能通过o ... -
两种自动类型转换:构造函数与operator
2010-09-12 02:23 927如果有两个对象:one, two, 要想把one转换成为two ... -
C++中的类拷贝构造函数和模板拷贝构造函数
2010-09-11 20:53 3034类(包括模板类)构造函数是真实的构造函数;然而模板构造函数,其 ...
相关推荐
这两种方式在本质上与`reinterpret_cast`相同,但在某些情况下可能会隐藏类型转换的问题,因此在C++中推荐使用现代的关键字转换。 总之,C++中的四种类型转换关键字提供了一套强大的工具,帮助开发者在不同类型之间...
本文将详细介绍C++中的四种类型转换方式:C风格类型转换、`const_cast`、`dynamic_cast`、`reinterpret_cast`和`static_cast`,并探讨它们的特点和应用场景。 #### 二、C风格类型转换 在C++中,C风格类型转换仍然...
C 风格(C-style)强制转型如下...ANSI-C++标准定义了四个新的转换符:reinterpret_cast, static_cast, dynamic_cast和const_cast,目的在于控制类(class)之间的类型转换。 1.1 reinpreter_cast 用法:reinpre
5. **类型转换**:条款2提到应尽量使用C++风格的类型转换,如`static_cast`、`dynamic_cast`、`reinterpret_cast`和`const_cast`。这些转换提供了更多的控制和安全性,相比C风格的强制类型转换(如`(type)expression...
3. **reinterpret_cast**:用于底层的类型转换,如指针与整数之间的转换,这可能导致实现依赖的结果,不推荐在普通代码中使用。 - 示例:`reinterpret_cast*>(ptr);` 将指针转换为整数。 4. **static_cast**:用于...
5. **reinterpret_cast**:这是最不安全的转换,它重新解释内存中的位模式。通常用于底层操作,如指针类型的转换,但可能导致不可预期的行为。 6. **C风格转换**:C++也支持C语言的旧式转换方式,如`(type)...
2. `cast` 结构:C语言还支持C++风格的类型转换,即使用`static_cast`、`const_cast`、`reinterpret_cast`和`dynamic_cast`,但这只在C++中可用,不是C语言的标准部分。 三、数据类型的兼容性 在C语言中,某些数据...
- **答案**: C++本质上不是完全类型安全的,因为提供了像 `reinterpret_cast` 这样的转换机制,可以将两种不同的类型进行强制转换。相比之下,如C#等现代语言通常提供更强的类型安全性保障。 #### 4. main函数执行...
if (total_memory - (size_t)(memory_pool - reinterpret_cast*>(nullptr)) ) { return nullptr; // 内存不足 } // 找到一块足够大的连续内存块 char* ptr = memory_pool; while (ptr < memory_pool + total_...
例如,使用static_cast进行基本类型的转换,使用const_cast移除或添加const限定符,使用reinterpret_cast进行低级别的类型转换,使用dynamic_cast进行类型安全的多态转换。 ### 3. 不要对数组使用多态 多态是C++中...
- `reinterpret_cast`:用于指针之间的转换,应谨慎使用。 **3. 不要对数组使用多态** - **问题背景:** - 数组通常不包含完整的对象信息,尤其是当它们是基类指针时。 - 使用多态可能会导致错误的行为,如对象...
在C++中,应尽量使用C++风格的类型转换,如`static_cast`、`dynamic_cast`、`const_cast`和`reinterpret_cast`,以提高代码的可读性和安全性。这些转换提供了不同的功能,如静态类型转换、运行时类型检查、常量性...
`static_cast`、`dynamic_cast`、`reinterpret_cast`和`const_cast`是C++中的类型转换方式,各有其特定用途。C语言中则有`(type)`强制类型转换。 10. **异常处理**: C++的`try`、`catch`和`throw`机制用于处理...
同类型指针可以直接赋值,而不同类型的指针赋值需要进行类型转换,通常使用`static_cast<>`、`const_cast<>`、`dynamic_cast<>`或`reinterpret_cast()`。值得注意的是,`void *`类型的指针可以接受任何类型指针的...
- **C++风格的类型转换**:包括`static_cast`, `const_cast`, `reinterpret_cast` 和 `dynamic_cast`。 - `static_cast`:用于基本数据类型之间的转换,以及取消基类/派生类之间的转换。 - `const_cast`:用于去除...