C/C++那些事儿之数的转换(二)

2014-11-24 12:10:56 · 作者: · 浏览: 1
signed dt = '\1';
long tdt;
tdt = -dt; ///==等价于=> (long)( (unsigned int) (-((unsigned int)u)) )
printf("%ld\n", tdt);
}
dt类型是 unsigned int ,不需要 (根据上面的第2条)提升, 因此 "-dt" 的类型仍然是"unsigned int". 所以-dt 的值就是"0xFFFFFFFF" (在二进制上看),然后强制转换成long类型并付给dt;因此 0x00000000FFFFFFFF的结果是4294967295。

对于
int main() {
unsigned char dt = '\1';

long tdt;
tdt = -dt;
printf("%ld\n", tdt);
}

tdt = -dt; unsigned char首先需要提升,提升成为"unsigned int" 如果-qupconv或-qlanglvl=extended;否则提升成“int”
因此-qupconv/-qlanglvl=extended时:tdt=-dt 等价于to "(long)( (unsigned int) (-((unsigned int)td)) )" 。从而结果是4294967295
在-qnoupconv(其他langlvl)时等价于"(long)( ( int) (-(( int)dt)) )" 结果是-1。
至此,我们终于能过回答“d=1,-d== ”了。其结果依赖于被操作数的类型,可能发生的的类型转换以及编译器选项。


作者 张培立