61页 是数据类型自动转换
63页 是数据类型强制转换
7、数据类型强制转换 强制类型转换是将某一数据类型的变量值或表达式的值取出转换为指定的另一种数据类型,强制类型转换对原运算对象的数据类型和数值不产生影响,强制转换是用强制转换运算符进行的,强制转换运算符为:(类型名),由强制转换运算符组成的运算表达式的一般形式为:(类型名)表达式。 比如:(float)a; // 将a在内存中的值取出转换成浮点数 (int)(x + y); // 将(x + y)在内存中的值取出转换成带符号整数 (float)x + y // 将x在内存中的值取出转换成浮点数 例2.11 数据传递时自动转换与强制转换 #include "STC15W4K.H" // 注意宏定义语句后面无分号 void main() { unsigned char a; unsigned long b; float c; for(;;) { b = 0x12345678; a = b; // 执行后a = 0x78,这里数据类型自动转换 a = (unsigned char)b; // 执行后a = 0x78,这里是数据类型强制转换 c = a; // 执行后f =120.00(0x78=120),自动转换 c = (float)a; // 执行后c =120.00(0x78=120),强制转换 } } 下例强制类型转换主要能让大家透彻理解指针的实际意义,可以在学完指针内容后再回来分析。 例2.12 强制类型转换实用技巧 //************** 强制类型转换实用技巧(地址类型转换)****************** //(A)将long型变量a(值:0x12345678)的第3个字节(值:0x56)赋给char型变量b。 // (B) 将数组的4个字节拼成1个long型变量 // (C) 将数组的4个字节转换成2个整数 // (D) 将数组的4个字节转换成1个float小数 // (E) 将float型变量各个字节取出 // (F) 将void型指针强制转换成任意类型指针 #include "STC15W4K.H" // 注意宏定义语句后面无分号 unsigned long a; unsigned char b; int c,d; unsigned char f1,f2; float f; void *p; // 定义指向类型不明确的数据的指针(指针就是数据存放的地址) unsigned char array[]={0x11,0x22,0x33,0x44}; struct stru { int a; int b; }; struct stru *pstru; // 定义指向结构体的指针变量 void main() { // ******************** 长 整 型 转 字 符 型 ****************** a=0x12345678; b=((unsigned char *)&a)[2]; // 执行后b=0x56 // 解释:长整型地址转字符型地址,(地址)[2],()是括号运算符,即先计算括号里面的内容, // 地址[2],表示取出当前地址加2地址中的内容。 // *********************** 数 组 转 长 整型 ********************* a=*((unsigned long *)array); // 执行后a=0x11223344 (数组的名字就代表数组首地址) // 解释:数组型地址转长整型地址,*(地址),()是括号运算符,即先计算括号里面的内容, // * 是取内容运算符。 // *********************** 数 组 转 结 构 体 ********************* pstru=(struct stru *)array; // 解释:数组型地址转结构体地址。pstru本来就是已定义好的专门存放地址的变量,即指针 // 变量 c=pstru->a; // 执行后c=0x1122 d=pstru->b; // 执行后d=0x3344 // 解释:使用"结构体变量地址->成员名"或"结构体变量名->成员名"的方法都可以访问结 // 构体中的数据 // *********************** 数 组 转 浮 点 型 ********************* f=*((float *)array); // 执行后f=0x11223344,对应小数是1.279534e-028 // 解释:数组型地址转浮点型地址。 // *********************** 数 组 转 字 符 型 ********************* p=array; // 解释:数组型地址转空类型地址。 b=((unsigned char *)p)[0]; // 执行后b=0x11 // *********************** 浮 点 型 转 字 符 型 ******************** f1=((unsigned char *)&f)[0]; // 执行后f1=0x11 // 解释:浮点型地址转字符型地址。 //或f1=*(((unsigned char *)&f)+0); // 执行后f1=0x11 f2=((unsigned char *)&f)[1]; // 执行后f2=0x22 ((unsigned char *)&f)[0] ^= 0x80; // 将4字节浮点数的符号位取反,注意^=书 // 写不要错误 // ******************* void 型 指 针 转 任 意 类 型 指 针************* p= array; f1= ((unsigned char *)p)[0]; // 执行后f1=0x11,访问数组中第1个字节的内容 } 代码解释: &a 表示取出变量a在内存中的首地址(注意是long型变量,只能1次4个字节访问)。 (unsigned char *) 表示强制转换成char型地址(地址也叫指针),1次1个字节访问。 [2] 表示取出第2个字节中的内容。 a=array 取出数组首地址(数组的名字就是数组的首地址) (unsigned long *) array将数组地址强制转换成long型地址(地址也叫指针) a = *((unsigned long *) array) // 取出long型地址中的内容 void *p 指针指向类型不明确的变量类型 2.1.4 变量存储空间(code、data 、bdata 、idata、xdata)
|