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

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

上面的程序给出了输出:ffffaa55。我期待 o/p 只有 aa55,因为 short int 是 2 个字节。谁能解释一下?

4

4 回答 4

5

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

请注意,不仅是~x具有 type 的表达式,甚至在有机会做任何事情之前int,它x本身就被提升为。换句话说,你被解释为.int~~x~(int) x

如果您需要原始窄类型的结果,则必须将其显式转换回原始类型。在 的情况下printf,显式转换不会解决任何问题(因为可变参数将被转换为int无论如何),您可以使用printf格式说明符将相应的参数解释为更窄类型的值。

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

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

于 2014-08-30T17:22:20.433 回答
5

你有:

short int x = 0x55AA;
~x;

表达式~x的类型为int

于 2014-08-30T17:14:50.810 回答
1
main()
{
 short int x=0x55AA;
 printf("%x ",~x);
}

在这里,~x 被视为有符号的 int。如果你想要 o/p 为 aa55,那么你应该对 unsigned short in.so 进行类型转换,试试这样..

 main()
 {
   short int x=0x55AA;
   printf("%x ",(unsigned short int)~x);//typecasting
 }
于 2014-08-30T17:50:33.403 回答
0

大多数算术和逻辑运算符是为 int 和 long 定义的,涉及较小类型的表达式涉及隐式转换,结果将是较大的类型。

此外,“%x”在任何情况下都是无符号整数格式说明符。

有多种解决方案,例如:

short x = 0x55AA ;
short nx = ~x ;
printf("%x ",~nx) ;


short x = 0x55AA ;
printf("%x ",~x & 0x0000FFFF ) ;
于 2014-08-30T17:40:52.373 回答