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不允许传递负值.
此外,对于具有位级语义的任何操作,使用无符号类型总是更好的主意.