用short int补充运算符

时间:2014-08-30 17:09:56

标签: c integer-promotion

#include <stdio.h>
#include <string.h>

main()
{
short int x=0x55AA;
printf("%x ",~x);
}

以上程序给出输出:ffffaa55。我期待o / p只有aa55,因为short int是2个字节。有人可以解释一下吗?

4 个答案:

答案 0 :(得分:5)

你有:

short int x = 0x55AA;
~x;

表达式~x的类型为int

答案 1 :(得分:5)

C语言从不以比[signed/unsigned] int更窄的类型执行计算。每次在表达式中使用较窄类型的值(如shortchar)时,该值都会隐式提升为[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 ) ;