C语言强制类型转换
来源:互联网 发布:淘宝卖星巴克券货源 编辑:程序博客网 时间:2024/05/16 05:17
当C/C++进行强制类型转换时,会有两种方式:
1. 保持内存中的内容不变,仅修改对这段内存的解释方式, 如int和char的互转
2. 保持值不变(近似),但修改内存中的内容,如int和double的互转
为了查看变量的内存值,我们定义如下的宏PRINTMEM:
#define PRINTMEM(str) cerr << #str << "=";ShowMem(&str, sizeof(str)); cerr<< endl;void ShowMem(void* a, int size){ char* p = (char*) a; for (int i = 0; i < size; ++i) { printf(" %.2x", p[i]); } cout << endl;}
下面的例子可以说明:
#include <iostream>#include <cstdio>using namespace std;#define PRINTME(str) cerr << #str << "=";showMem(&str, sizeof(str)); cerr<< endl;void showMem(void* a, int size){ char* p = (char*) a; for (int i = 0; i < size; ++i) { printf(" %.2x", p[i]); } cout << endl;}int main(){ double a = 25.0; int b = (int)a; char c = 'a'; int d = (int)c; PRINTME(a); PRINTME(b); PRINTME(c); PRINTME(d);}
例中,利用c语言对指针强制转换类型时,不改变指针的值的特性。实现函数showMem,这个函数也可以用union来实现。
为了使显示结果方便,使用了宏 PRINTME 打印变量名和变量的内存值,同时,使showMem的第二个参数可以随变量类型自适应的改变(可以认为像函数一样定义的宏是C语言借用了弱类型语言的优点)。
上例结果为:
a= 00 00 00 00 00 00 39 40
b= 19 00 00 00
c= 61
d= 61 00 00 00
从结果可见: double变量,强制转换成int时,虽然值没有发生变化,但内存内容发生了很大的变化,从 00 00 00 00 00 00 39 40 变成了 19 00 00 00
而对于char强制转换成int时,内存内容没有变化(存在填充0),只改变了对这段内存的解释方式。
不使用宏,也可以用模板函数来定义打印内存的函数:
template<class T>void printMem(T* a){ char* p = (char*) a; for (int i = 0; i < sizeof(T); ++i) { cout << hex << (int)*p++ << " "; } cout << endl;}
除了使用上述方法,还可以借用union来显示内存内容:
template<class T>class Trans{public: void showMem(T a) { SetVal(a); for (int i = 0; i < sizeof(a); ++i) { printf(" %.2x", dataUnion.mem[i]); } cout << endl; } private: union U { char mem[8]; T data; } dataUnion; void SetVal(T a) { dataUnion.data = a; }};
- C语言类型强制转换
- C语言强制类型转换
- C语言类型强制转换
- C语言强制类型转换
- [强制类型转换]C语言中的强制类型转换相关
- C语言中强制类型转换总结
- C语言指针强制类型转换
- C语言指针强制类型转换
- C语言指针强制类型转换
- C 语言中强制类型转换
- C语言指针强制类型转换
- C语言指针强制类型转换
- C语言中的强制类型转换
- 关于c语言中的强制类型转换
- C 语言 类型强制转换问题
- C语言: 指针强制类型转换
- C语言指针强制类型转换
- C语言指针强制类型转换
- ipse(或MyEclipse)中Outline和Package Explorer中小图标的含义
- 开源的比较好的pdf库
- 安卓开发-HttpClient使用
- iOS SEL类型
- 单链表
- C语言强制类型转换
- 随机选择算法---Randomized Selection Algorithm
- SQL Server 2008 转换为 SQL 2005 数据库 脚本生成
- [MFC] Edit Control 编辑框
- 利用PDFLib生成PDF文档
- hdu 4607 求树的直径
- The 21th-30th things after installing Ubuntu 12.04
- TouchDelegate
- 关于串行通信取代并行通信的解释