能力值:
( LV2,RANK:10 )
在线值:
2 楼
确实是经过了符号扩展。
挺容易忽略的。
能力值:
( LV3,RANK:30 )
3 楼
纠正一下
在执行if条件时,程序要把a的值和立即数0x8000进行比较。
但是a的值保存在内存当中,于是程序会将a的值从内存里取到寄存器中(通常是eax)
mov eax, a的地址 ; 这个是假想生成的代码
这里的说法不准确
a会进行符号扩展,是因为
if ( a == 0x8000)右边的0x8000程序认为是一个int型(可以用sizeof(0x8000)来证实)
所以这里不等长数进行比较,才会进行符号扩展,这个概念叫做整形提升。
刚刚我老师告诉我的。。
能力值:
( LV2,RANK:10 )
4 楼
会吗?试了结果输出是T啊,,不是F
能力值:
( LV2,RANK:10 )
5 楼
环境 VC6 ,WIN XP SP3
能力值:
( LV2,RANK:10 )
在线值:
6 楼
楼主,好像不对吧,short int最大表示范围:-32768到32767 ,可是int类型的表示范围也是-32768到32767,a=0x8000,也就是32768,发生溢出了,结果当然为F了,不知道理解对不对!请指教
能力值:
( LV2,RANK:10 )
在线值:
7 楼
这样的错误不是很烦人
能力值:
( LV4,RANK:50 )
8 楼
楼主很细心, 这个很容易忽略
能力值:
( LV2,RANK:10 )
在线值:
9 楼
这个是基础.
相当基础的东西,不过越是基础的越容易被忽视.
能力值:
( LV4,RANK:50 )
10 楼
很好,又学了一招,谢谢楼主了
能力值:
( LV2,RANK:10 )
11 楼
学习了 确实没注意到
能力值:
( LV2,RANK:10 )
12 楼
楼主很细心 学习了
能力值:
( LV4,RANK:50 )
在线值:
13 楼
请楼主给出修正版本
能力值:
( LV2,RANK:10 )
14 楼
说明最好不要把Signed和Unsigned进行比较
能力值:
( LV13,RANK:350 )
15 楼
从高级语言的角度来看 这样理解是没错的 你完全可以把0xffff8000看成-32768的 加个unsigned 就可以了
那int 0x80000000为什么没溢出呢 只能说是c高级语言理论体系和编译器(主要是计算机系统的关系)之间的摩擦吧
我是这样理解的 仅供参考
能力值:
( LV2,RANK:10 )
在线值:
16 楼
支持!
能力值:
( LV3,RANK:30 )
17 楼
回8楼:修正的方式就是定义成unsigned short int型。
回斑竹:
呵呵,这就是我没有在文章里写理解错误,而是写的理解有偏差的原因了。从高级语言的角度来看,这样的确是溢出了,但是溢出不足以解释这种现象,不够低层。
另外,我想说一下,为什么编译器会进行符号扩展。因为这里有一个概念:整形提升。所谓整形提升,就是运算符一边是整形,另一边是小于整形的类型,则需将较小的类型提升成整形再进行比较。如short int a ;
if (a == 0x80)这里,运算符'=='的左边是short int型,右边的0x80常数被认为是int型。编译器会将short int型扩展成int型再做比较。因为a是signed的,所以进行符号扩展了。
能力值:
( LV2,RANK:10 )
在线值:
18 楼
解释很好。
学习了
能力值:
( LV3,RANK:20 )
19 楼
d:\backup\我的文档\workshop ii\test\test.cpp(7) : warning C4305: '=' : truncation from 'const int' to 'short'
d:\backup\我的文档\workshop ii\test\test.cpp(7) : warning C4309: '=' : truncation of constant value
能力值:
( LV3,RANK:30 )
20 楼
对于这个问题,从我来说,一般是不会去注意关于类型转换的warning的。另外。。我的VC真的没有报warning。。。还有,有时候就算有了warning,我们也想知道这样会产生什么后果,和想象中的是否一样,以及这种后果的原因。因为同样一个知识点,也许在这里产生warning,但是在别的情况下就不会有提示。我们必须去了解它的内部到底是如何运转的。
能力值:
( LV2,RANK:10 )
21 楼
确实是比较容易忽略的问题,学习到了,呵呵
能力值:
( LV2,RANK:10 )
在线值:
22 楼
楼主很善于发现
能力值:
( LV2,RANK:10 )
在线值:
23 楼
如果你定义为unsigned or signed,直接指明是什么,它就不会出现这样的错误了。
而是你没有指明,所以用默认的东西出现的错误。
教训是:不要想当然。
能力值:
( LV12,RANK:240 )
24 楼
越界成了负数了。。