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

原创 2011年01月24日 10:47:00

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

 

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

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


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

 

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

实例如下:

 运行结果:

 

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

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

关于符号扩展、零扩展

关于符号扩展、零扩展 一、短数据类型扩展为长数据类型 1、要扩展的短数据类型为有符号数的       进行符号扩展,即短数据类型的符号位填充到长数据类型的高字节位(即比短数据...

c++类型转换时的符号位扩展

先从一到题开始:unsigned short A = 10; printf("~A = %u\n", ~A); char c = 128; printf("c = %d\n", c);//输出是...

关于整型数据符号位扩展的问题

关于符号扩展的问题,我们大家读到最多的一句关于符号扩展规律就是“对于无符号整型数据,要扩展成符号位的话,就是将扩展位补零,其他位保持不变。但对于有符号整型数据的符号扩展规律就是:原来符号位为1时,符号...

树莓派(ARM处理器), 符号位扩展的问题

最近在树莓派上做开发, 遇到了一个奇怪的问题 for example: char a = 0x8f; printf("%d", a); 我们希望得到  -113, 但是在树莓派上面得到的却是 ...

c中符号位扩展

今天面试,遇到这样一道题:char c = 128; printf("%c",c); printf("%u",c); printf("%d",c);问输出结果。printf("%u\n", c); /...

关于整型数据符号位扩展的问题

关于符号扩展的问题,我们大家读到最多的一句关于符号扩展规律就是“对于无符号整型数据,要扩展成符号位的话,就是将扩展位补零,其他位保持不变。但对于有符号整型数据的符号扩展规律就是:原来符号位为1时,符号...

C++:无法解析的外部符号问题 与 头文件包含注意要点

无法解析的外部符号
  • P3ray
  • P3ray
  • 2017年07月25日 09:05
  • 729

零位扩展和符号位扩展

零位扩展和符号位扩展 1、符号扩展:当用更多的内存存储某一个有符号数时,由于符号位位于该数的第一位,扩展之后,符号位仍然需要位于第一位,所以,当扩展一个负数的时候需要将扩展的高位...

编程中符号扩展

  • 2015年11月23日 11:38
  • 33KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ 中注意,零扩展和符号位扩展
举报原因:
原因补充:

(最多只允许输入30个字)