以下两段代码,为什么只改了无符号的类型 结果就不一样了 。
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?当表达式中存在无符号和有符号数类型时,不是应该所有操作都转化为无符号类型的吗?
本回答被网友采纳