C++ 中注意,零扩展和符号位扩展

版权声明:本文为博主原创文章,未经博主允许不得转载。

首先,介绍一下两种扩展的定义

转 http://blog.csdn.net/jaylong35/article/details/6160736

符号扩展:当用更多的内存存储某一个有符号数时,由于符号位位于该数的第一位,扩展之后,符号位仍然需要位于第一位,所以,当扩展一个负数的时候需要将扩展的高位全赋为1.对于正数而言,符号扩展和零扩展是一样的,因为符号位就是0. 
比如一个用一个8位二进制表示-1,则是10000001 
如果把这个书用16位二进制表示时,则为11111111 10000001 高位全都是1,这个叫做符号扩展,主要用于对其操作数。

零扩展就是全补零。不论其符号位是多少,高8位全都补0.

能过上面的定义可以看出在C++中,如果把一个char向一个整形转换的时候,就会存在着这个问题

如果你想得到一个正数,那么如果一个字符的ASCII码值是小于零的,而直接用(int)c进行强制类型转换,结果是通过符号扩展得到的也为一个负数。要得到正数,一定要用(int)(unsigned char)c;因为unsigned char去除了c的符号位,所以,这样的类型转换后,再用(int)进行转换得到的就是一个正数。

实例如下:

[c-sharp] view plain copy

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i =129;
  5. char chA= (char)i;
  6. int c = (int)(unsigned char)chA;
  7. int b = (int)chA;
  8. printf("sign extension: %d/n",b);
  9. printf("zero extension: %d/n",c);
  10. system("pause");
  11. return 1;
  12. }

运行结果:

sign extension: -127 
zero extension: 129  
请按任意键继续. . .

时间: 2024-08-05 19:36:49

C++ 中注意,零扩展和符号位扩展的相关文章

浅谈Java中的补零扩展和补符号位扩展

今天,魏屌出了一道题,题目如下: 定义一个大头序的byte[]a={-1,-2,-3,-4},转换成short[]b.问b[0]和b[1]分别是多少? 乍一看,这题不难,无非就是移位操作,再进行组合.但是呢?对于用Java的童鞋来说,这里面有一个坑,稍不注意可能就踩进去了.在说之前,我先把代码和答案贴出来吧. 看到这里,可能有的童鞋比较奇怪,为啥要&0xff,这不相当于没变化吗?非也,不信我举个例子. 答案是-127和129.很奇怪不是吗?我想的明明都是-127啊!!! 解答这个问题之前,我们先

char 变成int型后的符号位扩展

二进制负数: 原码就是原来的表示方法 反码是除符号位(最高位)外取反 补码=反码+1 1个字节它不管怎么样还是只能表示256个数,因为有符号所以我们就把它表示成范围:-128-127.它在计算机中是怎么储存的呢?可以这样理解,用最高位表示符号位,如果是0表示正数,如果是1表示负数,剩下的7位用来储存数的绝对值的话,能表示27个数的绝对值,再考虑正负两种情况,27*2还是256个数.首先定义0在计算机中储存为00000000,对于正数我们依然可以像无符号数那样换算,从00000001到011111

关于符号位扩展你又知道多少

转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/37535577 作者:小马 先看两段代码, 一个是C,一个是java. int _tmain(int argc, _TCHAR* argv[]) { char b = 0x83; short s1 = (short)b; short s2 = (short)(b&0xff); printf("s1 = %d\n", s1); printf("s2 = %

有符号数,符号位扩展

char readbuf[64]; int data_size = (readbuf[7]<<24)|(readbuf[4]<<16)|(readbuf[5]<<8)| readbuf[6]; int data_size = (readbuf[7]<<24)+(readbuf[4]<<16)+(readbuf[5]<<8)+readbuf[6]; readbuf :  09 00 3c 16 00 00 96 00 00 00 00

verilog中符号位的扩展问题

以下内容转自艾米电子 - 使用有符号数,Verilog(http://www.cnblogs.com/yuphone/archive/2010/12/12/1903647.html) Verilog-1995中的有符号数 在Verilog-1995中,只有integer数据类型被转移成有符号数,而reg和wire数据类型则被转移成无符号数.由于integer类型有固定的32位宽,因此它不太灵活.我们通常使用手动加上扩展位来实现有符号数运算.下面的代码片段将描述有符号数和无符号数的运算: 1 re

二进制中的符号位的区分以及表示

问题1: 二进制中的表数范围是怎么得来的? 无符号是0-255: 有符号是-128-127:为什么是这样的范围? 8位二进制码有2^8=256个状态.如果用来表示无符号数,就可以表示0~255恰好256个二进制数:而如果表示带符号数,则最高位就是符号位,0表示"+",1表示"-",剩下的7位用来表示绝对(采用补码形式).0用"+0"表示,正数为+1~+127,负数为-1~-127,剩下一个"-0"则用来表示-128(在数学中,

c语言中获取整数和浮点数的符号位

1. 为什么要获得符号位 很多时候,我们需要判断数值的正负,来做相应的逻辑处理.条件判断语句可以很好的完成这个需求.有时候会有下面的情况, if (x > 0) { x = x - 1; } else { x = 1 - x; } if (x < 0) { x = -x; } 正负只是数值的符号位变化,或是计算结果的符号位变化.但是我们需要用一个判断,首先条件判断会影响效率,其次格式不够简洁美观.所以,有时候希望能不用条件判断也解决问题.而数值的符号位已经被存储在了数值的最高位,可以利用这点来

P54 扩展数字的位表示

背景:不同字长的整数进行转换,需要在不改变数的大小的前提下将较小的数据类型转为更大的数据类型. 无符号数的扩展:开头加0即可,也叫零扩展. 有符号数(补码)的扩展:开头添符号位. 1 short sx = -12345; 2 unsigned short usx = sx; 3 int x = sx; 4 unsigned ux = usx; 5 6 printf("sx = %d:\t", sx); 7 show_bytes((byte_pointer)&sx, sizeof

Java中的二进制及基本的位运算

Java中的二进制及基本的位运算 二进制是计算技术中广泛采用的一种数制.二进制数据是用0和1两个数码来表示的数.它的基数为2,进位规则是"逢二进一",借位规则是"借一当二",由18世纪德国数理哲学大师莱布尼兹发现.当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的.计算机中的二进制则是一个非常微小的开关,用"开"来表示1,"关"来表示0. 那么Java中的二进制又是怎么样的呢?让我们一起来揭开它神