强制转换的使用技巧
来源:互联网 发布:淘宝水果供应商 编辑:程序博客网 时间:2024/06/06 01:39
//************** 强制类型转换实用技巧(地址类型转换)******************//(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个字节的内容}
学到一个东西:一个变量比如 char a, 对a取地址后 &a的类型为(unsigned char ), 此时( (unsigned char )a)[2] (举个例子而已,不要较真) 地址[2],表示取出当前地址加2地址中的内容
unsigned char a _at_ 0x0001; unsigned char b[]={0,1,2,3,4,5,6,7,8,9}; unsigned char c[][2]={{0,1},{2,3},{4,5}}; void main(){ a=b[3]; // a=3 b[2]=100; // b= {0,1,100,3,4,5,6,7,8,9}; *(b+2)=200; // b= {0,1,200,3,4,5,6,7,8,9}; b[-1]=4; // a=4; ((unsigned char *)(((unsigned long *)b)+1))[0]=250; // b={0,1,200,3,250,5,6,7,8,9}; while(1); }
特别注意:
((unsigned char )(((unsigned long )b)+1))[0]=250;
// b={0,1,200,3,250,5,6,7,8,9};
地址是long+1 也就是第5个字节,然后选择第五为250
阅读全文
0 0
- 强制转换的使用技巧
- 强制类型转换使用时的注意事项
- 编码的强制转换
- 数据类型的强制转换
- 指针的强制转换
- 对象的强制转换
- 强制的类型转换
- 强制类型的转换
- php的强制转换
- 指针的强制转换
- php的强制转换
- js强制类型转换技巧(Javascript)
- syslog和getopt_long_only的使用和void *指针强制转换
- C的强制转换和C++的强制转换
- 类型强制转换的危险
- 强制类型转换的问题
- C++风格的强制转换
- 指针的强制类型转换
- 栈和队列题
- JQ实现星星评价(带半星)
- mysqldump与innobackupex备份过程你知多少(完结篇)
- sgdisk基本用法
- 总结Unity遇到的坑及优化(持续更新)
- 强制转换的使用技巧
- C语言:指针的运算
- Java菜鸟的学习
- Volatile相关知识
- 把数组中的元素随机排列
- ListView滚动到底部自动加载数据
- JAVA-28-jsp脚本元素、指令元素
- IOS开发 实时检测网络状态
- Docker概念以及优势(推荐)