关于符号扩展多少你自己知道
2015-09-17 16:41
239 查看
转载请注明出处
http://blog.csdn.net/pony_maggie/article/details/37535577
作者:小马
先看两段代码, 一个是C,一个是java。
s1 = -125
s2 = 131
用两种语言。是想说明它的通用性,表示这个特性跟语言本身无关。
那么原因是什么呢?
首先。第二个结果才是我们期望的。这个应该都允许(至少大部分情况下都是这样)。其次假设变量b是正数(这里是负数。由于char表示有符号数,0x83最高位是1,表示负数)。S1和S2的结果是相等的。
所以,问题的核心事实上还是变量b的这个符号位。计算机里从低精度数向高精度数转换时。比方这里从char到short, 肯定会在前面扩展一些bit位。从而达到高精度数的长度。那么扩展时,是补0还是补1呢?这里有个原则就是。有符号数扩展符号位。也就是1,无符号数扩展0。
再看看上面的代码,s1事实上是0xff83, 是个负数。它表示的值就是-125(注意0xff83是补码表示,计算原值要换成原码)。
而s2是0x0083, 由于它强制与上了0xff,事实上就是与上了0x00ff。
这样就把高字节转成了0x00,消除了符号位。
为了证明上面的理论,能够做一个实验,把代码改成这样:
趁热打铁。再看一个演示样例:
你可能已经分析出原因了。字符a在和0xff比較时,被隐式的转换成int(由于0xff是整型),然后a做了符号位扩展。变为0xffffffff, 这个值和0x000000ff比較。当然是不等的。
我想有讲清楚,欢迎拍砖。
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 = %d\n", s2); return 0; }
public static void main(String[] args) { byte b = (byte)0x83; short s1 = (short)b; short s2 = (short)(b&0xff); System.out.printf("s1 = %d\n", s1); System.out.printf("s2 = %d\n", s2); }执行结果事实上是一样的:
s1 = -125
s2 = 131
用两种语言。是想说明它的通用性,表示这个特性跟语言本身无关。
那么原因是什么呢?
首先。第二个结果才是我们期望的。这个应该都允许(至少大部分情况下都是这样)。其次假设变量b是正数(这里是负数。由于char表示有符号数,0x83最高位是1,表示负数)。S1和S2的结果是相等的。
所以,问题的核心事实上还是变量b的这个符号位。计算机里从低精度数向高精度数转换时。比方这里从char到short, 肯定会在前面扩展一些bit位。从而达到高精度数的长度。那么扩展时,是补0还是补1呢?这里有个原则就是。有符号数扩展符号位。也就是1,无符号数扩展0。
再看看上面的代码,s1事实上是0xff83, 是个负数。它表示的值就是-125(注意0xff83是补码表示,计算原值要换成原码)。
而s2是0x0083, 由于它强制与上了0xff,事实上就是与上了0x00ff。
这样就把高字节转成了0x00,消除了符号位。
为了证明上面的理论,能够做一个实验,把代码改成这样:
int _tmain(int argc, _TCHAR* argv[]) { char b = 0x83; short s1 = (short)b; short s2 = (short)(b&0xffff); printf("s1 = %d\n", s1); printf("s2 = %d\n", s2); return 0; }执行,结果是s1=s2=-125。这也支持了上面的理论分析。
趁热打铁。再看一个演示样例:
int _tmain(int argc, _TCHAR* argv[]) { char a = 0xff; if (a == 0xff) { printf("equal\n"); } return 0; }执行的结果是, “equal”并没有打印出来。
你可能已经分析出原因了。字符a在和0xff比較时,被隐式的转换成int(由于0xff是整型),然后a做了符号位扩展。变为0xffffffff, 这个值和0x000000ff比較。当然是不等的。
我想有讲清楚,欢迎拍砖。
相关文章推荐
- dot.js-js模板引擎使用,教程,入门
- android第三更(下载附件,通知栏显示进度)
- Looper解析
- linux系统故障排除
- 打包静态库,文章mark
- 复合类型与const关键字
- js 模板引擎 为什么选择 dot
- HDU 1518 Square
- Struts 2 creating own interceptor
- 一些基础算法(2)
- oracle——安装图解
- c++引用与指针的区别(着重理解)
- DJANGO增加超级用户
- 新站优化最应该考虑哪些方面
- 实现域登录(学习历程)
- 利用mysql里的show global status和show variables来优化mysql的配置参数
- Nignx 运行原理
- VMware虚拟机配置文件(.vmx)损坏修复
- 关于ejb中的dao,services,vo理解
- 初识XML基础知识