用short int补充运算符

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个字节.有人可以解释一下吗?

Bil*_*nch 5

你有:

short int x = 0x55AA;
~x;
Run Code Online (Sandbox Code Playgroud)

表达式~x具有类型int.


AnT*_*AnT 5

C语言从不在比类型更窄的类型中执行计算[signed/unsigned] int.每次在表达式中使用较窄类型(如shortchar)的值时,该值都会隐式提升为[signed/unsigned] int.这里的一个重要细节是即使原始的窄类型unsigned仍然会被提升为有符号的类型int(假设它适合于范围int).在这种情况下,应该牢记这一点.

请注意,它不仅仅是~x具有类型的表达式int,它x本身int甚至在~有机会执行任何操作之前就被提升.换句话说,你~x被解释为~(int) x.

如果需要原始窄类型的结果,则必须明确地将其转换回原始类型.在的情况下printf,在这里显式转换不会解决任何问题(因为可变参数参数将被转换到int反正),可以使用printf的格式说明来解释相应参数较窄类型的值.

作为旁注,%x格式说明符需要一个unsigned int类型的参数.int不允许传递负值.

此外,对于具有位级语义的任何操作,使用无符号类型总是更好的主意.

  • 即使你将`~x`强制转换为`short int`,它也会在传递给`printf`时再次被提升为`int`.此时,它可能会被符号扩展(因为现在设置了msb).为了获得所需的行为,它应该转换为`unsigned short`,或者你应该使用正确的格式说明符. (2认同)