C 带短int的1补运算符 #包括 #包括 main() { 短整数x=0x55AA; printf(“%x”,约x); }
上面的程序给出了输出:ffffaa55。我期望o/p只有aa55,因为短int是2字节。有人能解释一下吗?您有: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
#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
的类型为intC语言从不以小于[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);