【发布时间】:2019-12-23 06:54:55
【问题描述】:
我正在尝试做某事,我基本上有两个问题。创建签名字符时,您如何 a)初始化和打印语句的约定是什么,用于以十六进制打印它和 b)如果我为我的字符分配了 -32 的值,我如何在 'e0' 之前打印没有 'ffffff' 的十六进制并且只打印 'e0' (如果可能的话,不删除 - )
我已经尝试了所有给出的常规语法,只是想知道我是否缺少明显的东西。
#include <stdio.h>
int main(void) {
signed char tempC = -32;
printf("%x\n", tempC);
return 0;
}
预期结果:e0
实际结果:ffffffe0
【问题讨论】:
-
%x格式指定对应的参数是unsigned类型。通过传递signed char,您的代码的行为因此是未定义的。为了达到您的预期,您需要将signed char转换为unsigned char,然后将unsigned char转换为unsigned以便打印。例如,printf("%x\n", (unsigned)((unsigned char)tempC))。而且,不,您不能直接将其转换为unsigned,因为signed char到unsigned的转换将根据unsigned的最大值进行换行。 -
如果你想在你的
printf格式中使用%x,那么你需要传递一个unsigned int。您可以使用(unsigned) (tempC & 0xff)。在这种情况下,tempC被提升为signed int,然后除了最右边的 8 位之外的所有内容都被屏蔽掉,结果被强制转换为unsigned int。 -
@Peter 你为什么说
unsigned而不是signed?-32和0xff都可以表示为int,因此根据C11 Standard - 6.3.1.1 Boolean, characters, and integers(p2),促销是int。
标签: c