首页 > 其他 > 详细

移位操作及其在数据类型转换中的作用

时间:2019-04-30 22:21:05      阅读:191      评论:0      收藏:0      [点我收藏+]

一.对移位操作的基本概述:

1、什么样的数据类型能够直接移位

char、short、int、long、unsigned char、unsigned short、unsigned int、unsigned long都能够进行移位操作。而double、float、bool、long double则不能够进行移位操作。

?

2、有符号数据类型的移位操作

对于char、short、int、long这些有符号的数据类型:

对负数进行左移:符号位始终为1。其它位左移

对正数进行左移:全部位左移。即 <<,可能会变成负数

对负数进行右移:取绝对值,然后右移,再取相反数

对正数进行右移:全部位右移。即 >>

?

3、无符号数据类型的移位操作

对于unsigned char、unsigned short、unsigned int、unsigned long这些无符号数据类型:

没有特殊要说明的。使用<< 和 >> 操作符就OK了

结束语

8086 中存在逻辑移位、算术移位,而C\C++中的移位似乎既不是逻辑移位,也不是算术移位。

比方-1,我们若对它右移1位,C的结果仍旧是-1,其实不管右移多少位始终是-1,逻辑移位得到的结果(8位表示)应该是-128。所以这点要注意。

二.利用移位操作实现不同数据类型的转换:

注:左移一位相当于*2。右移一位相当于除以2;

以下是实现long int 到unsigned char,及unsigned char 到short int转换的实例,在dev C++以下,已执行通过,请參考:

#include <stdio.h>

#include <malloc.h>

/*************************************************************************

NAME

???uint32Touint8

DESCRIPTION

??? Unpack auint32 into an array of 4 uint8s

*************************************************************************/

void uint32Touint8(unsigned char *dest, unsigned longint src)

{

??? *dest++ =src >> 24;

??? *dest++ =(src >> 16) & 0xFF;

??? *dest++ =(src >> 8) & 0xFF;

??? *dest = src& 0xFF;

}

?

/*************************************************************************

NAME

???uint8Touint16

DESCRIPTION

??? Pack anarray of 2n uint8s into an array of n uint16s

**************************************************************************/

void uint8Touint16(unsigned short int *dest, unsignedchar *src, unsigned short int n)

{

??? while (n--)

??? {

??????? *dest =*src++ << 8;

??????? *dest++|= *src++;

??? }

}

int main()

{

??? unsignedchar *dest1 = (unsigned char*)malloc(1);

??? unsignedlong int src1 = 0x12345678;

??? unsignedchar *src2 = (unsigned char*)malloc(2);

??? unsignedshort int *dest2 = (unsigned short int *)malloc(1) ;

??? *src2 =0x12;

??? *(src2+1) =0x34;

???uint32Touint8(dest1,src1);

???uint8Touint16(dest2,src2,1);

??? if(dest1 !=NULL)

??? {

??? for(int i=0;i<4; i++)

???printf("dest[%x] = 0x%x\n",i,dest1[i]);

???}/*dest[0]=0x12,dest[1]=0x34,dest[2]=0x56,dest[3]=0x78*/

??? if(dest2 !=NULL)

??? {

???printf("dest2 = 0x%x\n",*dest2++);

???}/*dest2=0x1234*/

??? getchar();

??? return 0;

??? }

移位操作及其在数据类型转换中的作用

原文:https://www.cnblogs.com/xfgnongmin/p/10798170.html

(0)
(0)
   
举报
评论 一句话评论(0
分享档案
最新文章
教程昨日排行
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!