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、要扩展的短数据类型为有符号数的       进行符号扩展,即短数据类型的符号位填充到长数据类型的高字节位(即比短数据...

关于符号扩展

一、短数据类型扩展为长数据类型 1、要扩展的短数据类型为有符号数的       进行符号扩展,即短数据类型的符号位填充到长数据类型的高字节位(即比短数据类型多出的那一部分),保证扩展后的数...

C语言的位域和符号位扩展

最近面试易路联动的时候考了位域方面的只是,结果全做错了,回来想了会也没弄明白,后来上网查了下原来是英特尔的面试题代码如下struct test{ int a:1; int b:1; int c:...

如何在O(1)的时间里删除单链表的结点

题目是这样的:给你一个单链表的表头,再给你其中某个结点的指针,要你删除这个结点,条件是你的程序必须在O(1)的时间内完成删除。 由于有的同学对链表还不是很熟悉,本文尽量描述的通俗易懂,老鸟请直接跳过前...

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

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

符号位扩展,数据截断

符号位扩展

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

问题的核心其实还是变量b的这个符号位。计算机里从低精度数向高精度数转换时,比如这里从char到short, 肯定会在前面扩展一些bit位,从而达到高精度数的长度。那么扩展时,是补0还是补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、符号扩展:当用更多的内存存储某一个有符号数时,由于符号位位于该数的第一位,扩展之后,符号位仍然需要位于第一位,所以,当扩展一个负数的时候需要将扩展的高位...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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