char, unsigned char, int,unsigned int之间的相互转换

2018年12月01日 23:45:21 _业精于勤_ 阅读数:667 标签: 数据转换 更多

个人分类: C语言

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/WZJwzj123456/article/details/84679383

最近写代码的时候发现一个问题,我有一个数据是放在两个寄存器中的,一个表示高8位,一个表示低八位,我的这个数据是有符号的,那我在算出数据的时候就需要把两个寄存器的值进行合并了,这样就需要把数据从char 转换到short类型了。

现在假定我有两个char型数据ch1,ch2。需要把结果写入一个short型的数据data。假定ch1为低8位数据,ch2为高8位数据

最开始我是这样写的:

data = (((short)ch2 << 8) & 0xff00) | (short(ch1) & 0x00ff);

这样写数据总是不对,于是就查阅了一些资料,也加了一些log查看数据,最终发现了问题,今天就借这个机会总结一下数据转换的问题。

整数在计算机中是以二进制补码的方式表示的,以int型为例:

int有4个字节,最高位为符号位 0表示正,1表示负

举个例子+3在计算机里存储为0000 0000  0000 0000  0000 0000  0000 0011b;

负数为即将该负数的绝对值按位取反,然后加1,那么-3在计算机中的存储就为1111 1111  1111 1111  1111 1111 1111 1101b;

数据转换大致可分为两种

1:低字节向高字节转换

2:高字节像低字节转换

首先我们先分析第一种,低字节向高字节转换,这种转换方式会采取高位补位的方式

例如将char型的3(0000 0011b)转换成int型,那就是转换为(0000 0000  0000 0000  0000 0000  0000 0011b)

例如将char型的3(0000 0011b)转换成unsigned int型,那就是转换为(0000 0000  0000 0000  0000 0000  0000 0011b)

例如将char型的-3(1111 1101b)转换成int型,那就是转换为(1111 1111  1111 1111  1111 1111 1111 1101b)

例如将char型的-3(1111 1101b)转换成unsigned int型,那就是转换为(1111 1111  1111 1111  1111 1111 1111 1101b)

通过上面的例子我们可以看出,低字节向高字节转换,采取的补位方式会因为数据正负而有不同,其实就是补数据位,正数补0,负数补1。基于这种方式,我们在将char型的-3转换成unsigned int型的数据时就会出现错误。

第二种情况就是高字节向低字节转换,这种转换会采取直接截取的方式

这种情况比较容易理解这里就不多说。

现在回到最开始的问题

data = (((short)ch2 << 8) & 0xff00) | (short(ch1) & 0x00ff);

这个运算会有什么问题,首先我们知道ch1,ch2都是有符号的,如果两者都为负值,那我对ch1的处理就是有问题的,因为我在转换的时候会将ch1的符号位也当成了数据位来计算,就会出现差错。

所以我们在转换的时候如果遇到负数,要特别小心下符号位和数据位的区别

char, unsigned char, int,unsigned int之间的相互转换相关推荐

  1. JavaSE · 常量介绍 · 变量类型转换 · 理解数值提升 · int 和 Stirng 之间的相互转换

    书接上回 Java 变量介绍 我们继续学习以下内容. 四.常量 字面值常量 final 关键字修饰的常量 五.理解类型转换 int 和 long/double 相互赋值 int 和 boolean 相 ...

  2. C++实现int与string之间的相互转换

    2019独角兽企业重金招聘Python工程师标准>>> c++ 利用stringstream实现int与string类型的相互转换,记录在此,以备后用 #include<ios ...

  3. Python:int,float,str之间的转换

    文章目录 数据类型转换 其它数据转换的内置函数 数据类型转换 主要介绍int,float,str之间的相互转换,转换方向见上图. 其它数据转换的内置函数 python各种类型转换-int,str,ch ...

  4. C语言unsigned char、char与int之间的转换

    C语言unsigned char.char与int之间的转换 2016年10月23日 18:40:50 bladeandmaster88 阅读数:11347更多 个人分类: c语言基础 先来看一道题: ...

  5. 打印不同对象的字节表示 ( 对int*强制转换成unsigned char*的理解 )

    此文章参考<深入理解计算机系统>P31. 先看如下代码:  12345的十六进制表示为:0x00003039 1 #include <stdio.h> 2 3 int main ...

  6. 2字节char转16进制unsigned char或者int

    在C语言中,常常需要将txt文件转换成bin文件,所以需要将两字节的字符,转换成16进制的unsigned char类型.有时也会将int型转换成两字节的char,还原时也需要转换. /*! @Bri ...

  7. cv::mat与unsigned char*相互转化之间的转换

    #include<iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui ...

  8. C语言char *转数组,C语言char*字符串数组和unsigned char[]数组的相互转换

    #include #include using namespace std; void convertUnCharToStr(char* str, unsigned char* UnChar, int ...

  9. c# char unsigned_c – unsigned char和char指针之间的区别

    我对unsigned char(在WinAPI中也是BYTE)和char指针之间的差异感到困惑. 目前我正在使用一些基于ATL的遗留代码,我看到很多表达式如下: CAtlArray rawConten ...

最新文章

  1. 机房冷热通道系统整体解决方案
  2. python输出第几行第几个_python怎么PRINT出第几行
  3. AIX 6.1安装JDK6环境变量设置
  4. 解决myeclipse中新导入的工程旁出现红色感叹号的问题
  5. MySQL笔记-group by和聚合函数的使用
  6. 在c#中使用WINDOWS API(转)
  7. 自定义“TB_定位访问”子类
  8. Maven—Eclipse设置Maven项目JDK版本
  9. 微信小程序上传照片加水印
  10. Linux 程序 动态库 静态库依赖关系
  11. linux驱动篇-Led
  12. contiki 操作教程
  13. 这些“新职业”到底好不好干?听听过来人怎么说
  14. vivo X Fold和OPPO Find N
  15. 大数据平台架构与原型实现-读书笔记8
  16. Lazada新手批量发布产品快速铺货详细教程:
  17. p720 自带的磁带机备份aix系统
  18. 关于智慧团建忘记密码的解决方法
  19. Spark 全套知识体系,终于搞到了!
  20. java水仙花数10000_java打印10000以内的水仙花数

热门文章

  1. 基于php的海贼王动漫网站
  2. 新一配:5G与4G的不同工作原理【转载】
  3. 昂瑞威 HS6621 低功耗蓝牙芯片烧录调试
  4. (面向对象)员工信息管理系统 1.当有新员工的时候将员工加入到管理系统 2.可以根据工号实现对该员工信息查询 3.可以现实查看所有员工信息 4.可以修改员工的薪水
  5. 阿里巴巴客户体验事业群智能客服调度最佳实践
  6. Volumes 数据卷管理
  7. Docker(五)进阶:Docker卷(volumes)
  8. 一文彻底看懂LightGBM
  9. 关于深度学习人工智能模型的探讨(四)(6)
  10. apex语言与java比较_Apex 基础知识合辑