C 带短int的1补运算符 #包括 #包括 main() { 短整数x=0x55AA; printf(“%x”,约x); }

C 带短int的1补运算符 #包括 #包括 main() { 短整数x=0x55AA; printf(“%x”,约x); },c,integer-promotion,C,Integer Promotion,上面的程序给出了输出:ffffaa55。我期望o/p只有aa55,因为短int是2字节。有人能解释一下吗?您有: #include <stdio.h> #include <string.h> main() { short int x=0x55AA; printf("%x ",~x); } 表达式~x的类型为int您有: #include <stdio.h> #include <string.h> main() { short int x=0x

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

您有:

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

main()
{
short int x=0x55AA;
printf("%x ",~x);
}
表达式
~x
的类型为
int

您有:

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

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

表达式
~x
的类型为
int

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

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

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

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


另外,对于任何具有位级语义的操作,最好使用无符号类型。

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

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

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

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


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

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

而且“%x”在任何情况下都是无符号int格式说明符

有多种解决方案,例如:

short int x = 0x55AA;
~x;

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

而且“%x”在任何情况下都是无符号int格式说明符

有多种解决方案,例如:

short int x = 0x55AA;
~x;
在这里,~x被视为带符号的int。如果您希望o/p为aa55,那么您应该对无符号的短输入进行类型转换。因此,请尝试这样做

main()
{
 short int x=0x55AA;
 printf("%x ",~x);
}
在这里,~x被视为带符号的int。如果您希望o/p为aa55,那么您应该对无符号的短输入进行类型转换。因此,请尝试这样做

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

%x”
-->
%hx”
@pat哦,我想OP会问为什么
~x
-x
会产生不同的结果。我没有回答这个问题-我的错。相关的@Benjamin Gruenbaum
~x
x
的一部分。
%x
-->
%hx
@pat哦,我想OP问了为什么
~x
-x
产生了不同的结果。我没有回答这个问题-我的错。相关的@Benjamin Gruenbaum
~x
x
。即使您将
~x
转换回
short int int
,当传递到
printf
时,它也会再次升级为
int
。此时,它可能会被符号扩展(因为msb现在已设置)。要获得所需的行为,应将其转换为
unsigned short
,或者应使用正确的格式说明符。如果每个数据类型都需要转换为int,那么char x=0X55AA如何;printf(“%x”,~x)@德波奈尔:怎么样?如上所述,在
~x
中,
char
类型的值以完全相同的方式转换为
int
。唯一的问题是
0x55AA
无法放入典型的
char
。即使将
~x
转换回
short int int
,当传递到
printf
时,它也会再次升级为
int
。此时,它可能会被符号扩展(因为msb现在已设置)。要获得所需的行为,应将其转换为
unsigned short
,或者应使用正确的格式说明符。如果每个数据类型都需要转换为int,那么char x=0X55AA如何;printf(“%x”,约x);