C++ 类型变换signed->unsigned

以下两段代码,为什么只改了无符号的类型 结果就不一样了 。
int a=100;
unsigned int i=99;
cout<<i-a;
结果为4294967295
(这个我知道是因为按无符号显示,-1的补码是4294967295

int a =100;
unsigned short i=99;
cout<<i-a;
结果为-1,
为什么这个结果就正常了?

刚好 C++ Primer 看到这段,帮你解释下。

C++ 的隐式转换有个机制,就像上边那个答案说的,如果操作数是小尺寸类型(bool、char、short,unsigned short 等),在运算之前会先被转换成大尺寸的类型 int(如果不够大,那就 unsigned int)。

由于你机器上 short 比 int 占的字节少,unsigned short 被转换成 int了,结果自然是-1。


顺便一提,unsigned 和 signed 类型之间的转换也是有若干方向的:

    unsigned 和 signed 类型如果大小相同,或者 unsigned 更大,那么 signed 会转换成 unsigned。

    如果 signed 类型占的更大,这个就跟运行环境相关了。以 unsigned int 和 long 举例,如果在当前环境中 long 和 unsigned int 占的字节一样,那么 unsigned int 的值强行转换成 long 可能会有丢失,long 就会变成 unsigned int(如果long是负的,会悲剧地变成完全不同的数)。如果 long 比 int 占更多字节, 那么自然低地, unsigned int 就会变成 long。


其实 unsigned short 和 int 的运算也不一定就是 int。就像一开始说的,如果你运行环境中 unsigned short 和 int 占的字节一样大,前者的值强行转换为后者就可能会有丢失,那么 unsigned short 会首先转换成 unsigned int,然后 int 也变成 unsigned int,最后两者再运算。


总之核心原则就是,这种隐形类型转换都是尽量往表示范围更大的类型上靠。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-09-06
在你的计算机上,int型占4个字节,unsigned short 占2个字节,利用cout输出时,会自动向字节长的类型转换,你还可以试试
int a = 100;
double i = 12.1;
cout<<i-a;追问

这我知道 ,可还是不能理解,为什么第二段代码就是-1?当表达式中存在无符号和有符号数类型时,不是应该所有操作都转化为无符号类型的吗?

本回答被网友采纳