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

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

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;

}

移位操作及其在数据类型转换中的作用,布布扣,bubuko.com

时间: 2024-10-25 01:57:25

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

数据类型转换中 Number()、parseInt()、parseFloat()的区别

1. Number() 只要出现非数字就是NaN ‘0100’→ 100 ‘+100’→ 100 ‘2.1’→ 2.1 true转为1,false转为0      a.如果转换的内容可以转成数字,那么就直接返回这个内容对应的数字.( 数组里有单个纯数字.单个只含数字的字符串可以转换:如果数组里有多组数据,就无法转数字,返回NaN.) b.将整体进行转换,如果有一个不可以转换那么返回NaN.(‘100px’ 这种数字加字母的字符串,返回NaN) c.如果在内容中出现小数,那么小数会保留,也会输出小

数据类型转换中的一些特殊情况(JY06-JavaScript)

1.字符串的不可变性 字符串定义了后,会一直占据内存空间,企鹅该处内存空间(栈)不可被重新赋值. 2.短路运算 ||.&& 二元运算符,返回参与运算的操作数的原值(原数据类型和原数据), 运算结束后,返回导致运算结束的那个操作数. 3.三元运算符 code1?code2:code3;   与if-else 不同: 返回code2或code3的值----code2,code3   都可以空的{}代替:      不能写break,continue. 4.NaN NaN !=NaN, 任何Na

python中的数据类型转换

今天想要写的是python中比较简单但是又相对重要的数据类型之间的互相转换.所谓数据类型转换其实很简单,生活中就有很多的例子,比如:15+2.2=17.2,看着好像只是一次普通的数学运算,但是却存在了一次数据类型之间的转换."15"在数据类型中被称为整型,"2.2"在数据类型中则被称之为浮点型,那么在我们的程序中整型是没办法直接和浮点型的数据进行运算操作,这时候我们可爱的python就偷偷的将"15"转化成了"15.0"的浮点

[转]VHDL中数据类型转换与移位(STD_LOGIC_ARITH与NUMERIC_STD)

1. VHDL目前常用库文件 目前写VHDL程序时,大部分人已经熟悉的库调用如下所示: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; --或者 use ieee.std_logic_signed.all; 这几个库文件的源码可以在IEEE库文件链接中查看,首先阐述一下这些文件的内容和主要作用: - std_logic_1164 :

也谈SQL Server 2008 处理隐式数据类型转换在运行计划中的增强

在 SQL Server 查询中,不经意思的隐匿数据类型转换可能导致极大的查询性能问题.比方一个看起来没有不论什么问题简单的条件:WHERE c = N'x' .假设 c 的数据类型是 varchar.而且表中包括大量的数据,这个查询可能导致极大的性能开销.由于这个操作会导致列 c 的数据类型转换为 nvarchar与常量值匹配,在 SQL Server 2008 及之后的版本号中,这样的操作做了增强,一定程度上减少了性能开销,參考SQL Server 2008 处理隐式数据类型转换在运行计划中

也谈SQL Server 2008 处理隐式数据类型转换在执行计划中的增强

在 SQL Server 查询中,不经意思的隐匿数据类型转换可能导致极大的查询性能问题,比如一个看起来没有任何问题简单的条件:WHERE c = N'x' ,如果 c 的数据类型是 varchar,并且表中包含大量的数据,这个查询可能导致极大的性能开销,因为这个操作会导致列 c 的数据类型转换为 nvarchar与常量值匹配,在 SQL Server 2008 及之后的版本中,这种操作做了增强,一定程度上降低了性能开销,参考SQL Server 2008 处理隐式数据类型转换在执行计划中的增强

JavaScript中数据类型转换总结

在js中,数据类型转换分为显式数据类型转换和隐式数据类型转换. 1, 显式数据类型转换 a:转数字: 1)Number转换: 代码: var a = "123"; a = Number(a); 注意: a)如果转换的内容本身就是一个数值类型的字符串,那么将来在转换的时候会返回自己. b)如果转换的内容本身不是一个数值类型的字符串,那么在转换的时候结果是NaN. c)如果要转换的内容是空的字符串,那以转换的结果是0. d)如果是其它的字符,那么将来在转换的时候结果是NaN. 2)pars

Arduino中数据类型转换 float/double转换为char 亲测好使,dtostrf()函数

如何轻松玩转Arduino单片机,当我在进行数据转换的时候,遇到了问题,尝试了C语言和C++中的好多函数,都没有达到将float型数据转换为char型的目的.苦苦查阅资料后,终于找到了一个大神级函数!!!dtostrf(),可以轻松实现数据类型from   float   to  char .            get it 格式如下: char* dtostrf(double _val,signed char _width, unsigned char prec, char* _s) 参数

Arduino中数据类型转换 int转换为char 亲测好使,itoa()函数

由于博主最近在做一个项目,需要采集不同传感器的数据,包括float型的HCHO,以及int型的PM2.5数据.但是最终向服务器上传的数据都得转换为char型才能发送,这是借鉴了一个github上面的实例实现了在Arduino上部署socket使之与服务器进行交互. github实例如下: https://github.com/washo4evr/Socket.io-v1.x-Library 在本项目中多次使用了数据类型转换,前文提到了float和double类型转换为char,如下:http:/