C++ 类型变换signed->unsigned

2025-03-04 03:49:48
推荐回答(2个)
回答1:

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

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

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


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

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

  2. 如果 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,最后两者再运算。


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

回答2:

在你的计算机上,int型占4个字节,unsigned short 占2个字节,利用cout输出时,会自动向字节长的类型转换,你还可以试试
int a = 100;
double i = 12.1;
cout<