c语言强制转换例子,C语言强制类型转换

本文探讨了C/C++中强制类型转换的两种方式,通过实例展示了类型转换过程中内存内容的变化。当从double转换为int时,尽管值保持不变,但内存内容发生显著变化;而char转int时,内存内容不变,只是解释方式改变。作者提供了宏定义`PRINTMEM`和函数`showMem`用于查看变量的内存表示,并讨论了使用模板函数和union实现相同功能的方法。
摘要由CSDN通过智能技术生成

当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

#include

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

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 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;

}

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值