#include <stdio.h>
#include <string.h>
main()
{
short int x=0x55AA;
printf("%x ",~x);
}
以上程序给出输出:ffffaa55。我期待o / p只有aa55,因为short int是2个字节。有人可以解释一下吗?
答案 0 :(得分:5)
你有:
short int x = 0x55AA;
~x;
表达式~x
的类型为int
。
答案 1 :(得分:5)
C语言从不以比[signed/unsigned] int
更窄的类型执行计算。每次在表达式中使用较窄类型的值(如short
或char
)时,该值都会隐式提升为[signed/unsigned] int
。这里的一个重要细节是,即使原始的窄类型为unsigned
,它仍将被提升为签名类型int
(假设它适合int
的范围)。在这种情况下,应该牢记这一点。
请注意,~x
表达式int
不仅仅是x
,而int
本身甚至在~
之前就被提升为~x
有机会做任何事情。换句话说,您的~(int) x
被解释为printf
。
如果您需要原始窄类型的结果,则必须明确地将其转换回原始类型。在int
的情况下,显式转换不会解决任何问题(因为variadic参数无论如何都会转换为printf
),您可以使用%x
格式说明符来解释相应的参数值较窄的类型。
作为旁注,unsigned int
格式说明符需要int
类型的参数。不允许传递负{{1}}值。
此外,对于具有位级语义的任何操作,使用 unsigned 类型总是更好。
答案 2 :(得分:1)
main()
{
short int x=0x55AA;
printf("%x ",~x);
}
这里,~x被视为signed int。如果你想要o / p为aa55,那么你应该对无符号short in.so进行类型转换,试试这样..
main()
{
short int x=0x55AA;
printf("%x ",(unsigned short int)~x);//typecasting
}
答案 3 :(得分:0)
在大多数情况下,算术和逻辑运算符是为int和long定义的,涉及较小类型的表达式涉及隐式转换,结果将是较大的类型。
此外,“%x”在任何情况下都是无符号的int格式说明符。
有各种解决方案,例如:
short x = 0x55AA ;
short nx = ~x ;
printf("%x ",~nx) ;
short x = 0x55AA ;
printf("%x ",~x & 0x0000FFFF ) ;