deb*_*air 1 c integer-promotion
#include <stdio.h>
#include <string.h>
main()
{
short int x=0x55AA;
printf("%x ",~x);
}
Run Code Online (Sandbox Code Playgroud)
上面的程序给出了输出:ffffaa55.我期待o/p只有aa55,因为short int是2个字节.有人可以解释一下吗?
C语言从不在比类型更窄的类型中执行计算[signed/unsigned] int
.每次在表达式中使用较窄类型(如short
或char
)的值时,该值都会隐式提升为[signed/unsigned] int
.这里的一个重要细节是即使原始的窄类型unsigned
仍然会被提升为有符号的类型int
(假设它适合于范围int
).在这种情况下,应该牢记这一点.
请注意,它不仅仅是~x
具有类型的表达式int
,它x
本身int
甚至在~
有机会执行任何操作之前就被提升.换句话说,你~x
被解释为~(int) x
.
如果需要原始窄类型的结果,则必须明确地将其转换回原始类型.在的情况下printf
,在这里显式转换不会解决任何问题(因为可变参数参数将被转换到int
反正),可以使用printf
的格式说明来解释相应参数较窄类型的值.
作为旁注,%x
格式说明符需要一个unsigned int
类型的参数.int
不允许传递负值.
此外,对于具有位级语义的任何操作,使用无符号类型总是更好的主意.