short转换为char,提取单字节

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:19   2281   0

本文描述:将两个字节长度的wdVersion,分别提取出低字节和高字节的值,此方法可以用于不同类型不同长度的单字节提取!

(注释种的位操作的方法也可以,先 移位 后 位与 操作)

wdVersion的类型为 unsigned short。2字节

取变量wdVersion(长度2字节)的第一个字节的值!
第一步,取首地址 &wdVersion
第二步,强制转换 (char*)&wdVersion 将2字节data变成1字节!!!
第三步,取值 *((char*)&wdVersion)

#include<WinSock2.h> //头文件,Windowssocket
#pragma comment(lib,"ws2_32.lib")//加载库文件
# include<stdio.h>

int main(void)
{
 WORD wdVersion = MAKEWORD(2, 1);//2.1  //typedef unsigned short      WORD; 两个字节
 //WSAStartup(,);
 
 //取变量wdVersion(长度2字节)的第一个字节的值!
  //第一步,取首地址          &wdVersion
  //第二步,强制转换          (char*)&wdVersion  将2字节data变成1字节!!!
  //第三步,取值              *((char*)&wdVersion)

 int a = *((char*)&wdVersion);  //取低字节:变成(char*)并取值
 int b = *((char*)&wdVersion+1);//取高字节:变成(char*)后+1,并取值

 int c = (char*)(&wdVersion);
 int d = (char*)(&wdVersion+1);
 
 int e = *(&wdVersion);//258,完整的short类型的值
 int f = *((char*)(&wdVersion) + 1);//同int b
    int g = *((char*)(&wdVersion + 1));-52,h的值取了第二个字节
 int h = *(&wdVersion + 1);//wdVersion首地址+2后的地址所存储的值,类型和值都未知

 /*
 //取字节的另一种方法:位操作!!!
 int c = (wdVersion>>8)&0xff;//取高字节
 int d = wdVersion & 0xff;//取低字节
 */

 printf("a=%d b=%d c=%d d=%d e=%d f=%d g=%d h=%d\n", a, b,c,d,e,f,g,h);
 

 system("pause");
 return 0;
}

wdVersion=258= 0000 0001 0000 0010;高字节是1,低字节是2

十进制52428=》二进制1100 1100 1100 1100=》高字节1100 1100(此为补码)=》最高位代表负号 (-1得到反码)11001011=》(除符号位外各位取反)得到原码10110100=》去掉符号位得110100=52(绝对值)

验算:-52= (最高符号位)原码1011 0100 =(除符号位外各位取反)反码 1100 1011=(+1后得到)补码 11001100

结论:

1. (char*)的意义在于,将原本两个字节的short类型,断开成了单字节!

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP