【问题标题】:ones complement operator with short int用 short int 补码运算符
【发布时间】:2014-08-30 17:09:55
【问题描述】:
#include <stdio.h>
#include <string.h>

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

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

【问题讨论】:

标签: c integer-promotion


【解决方案1】:

你有:

short int x = 0x55AA;
~x;

表达式~x 的类型为int

【讨论】:

  • ... 另外,“%x”在任何情况下都是一个 int 格式说明符。
  • @Clifford:更准确地说,无论使用什么格式说明符,一个狭窄的可变参数都将被提升为int。 (而%x 实际上是一个unsigned int 格式说明符)
  • @AndreyT:正是 ;-)
  • 如果每个数据类型都需要转换为 int 那么 char x=0X55AA; printf("%x",~x); ?
  • @sharth:如果charint 窄,则char 始终提升为已签名int,无论char 本身是已签名还是未签名。
【解决方案2】:

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

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

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

附带说明,%x 格式说明符需要 unsigned int 类型的参数。不允许传递负的 int 值。

此外,对于任何具有位级语义的操作,最好使用 unsigned 类型。

【讨论】:

  • 即使将~x 转换回short int,当传递给printf 时,它也会再次提升为int。那时,它可能会被符号扩展(因为现在设置了 msb)。要获得所需的行为,应将其强制转换为 unsigned short,或者您应该使用正确的格式说明符。
  • 如果每种数据类型都需要转换为 int 那么 char x=0X55AA; printf("%x",~x); ?
  • @debonair:怎么样?正如我上面所说,在~x 中,char 类型的值以完全相同的方式转换为int。唯一的问题是0x55AA 不适合典型的char
【解决方案3】:
main()
{
 short int x=0x55AA;
 printf("%x ",~x);
}

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

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

【讨论】:

    【解决方案4】:

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

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

    有多种解决方案,例如:

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

    【讨论】:

      猜你喜欢
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      相关资源
      最近更新 更多