在C中显示整数到十六进制

在C中显示整数到十六进制,c,casting,integer,printf,hex,C,Casting,Integer,Printf,Hex,我在C类中有这部分代码: int i; for (i=0;i<val;i++) mdl_print ("%u ", rec->payload[i]); mdl_print ("\n"); inti; 对于(i=0;ipayload[i]); mdl_打印(“\n”); 变量rec->有效负载为uint8\u t类型。我会用十六进制表示法打印出来 我该怎么办?谢谢。简单快捷: print("%x", (int)(rec->payload[i])

我在C类中有这部分代码:

int i;
    for (i=0;i<val;i++)
        mdl_print ("%u ", rec->payload[i]);
    mdl_print ("\n");
inti;
对于(i=0;ipayload[i]);
mdl_打印(“\n”);
变量rec->有效负载为uint8\u t类型。我会用十六进制表示法打印出来

我该怎么办?谢谢。

简单快捷:

print("%x", (int)(rec->payload[i]));
要以0x05格式显示,请使用:

print("0x%02x", ...)
相反。

如果mdl_print()与标准C函数printf()类似,请尝试以下操作:

printf( "%02x", (int) rec->payload[i] );
用于十六进制写入的基本printf格式代码是%x。“02”表示用“0”填充数字,直到它有两个字符宽,这是通常打印int8的方式

许多自定义输出函数都以这种方式遵循printf的格式,因为C程序员非常熟悉printf。您可以在printf的手册页上阅读更多关于printf的信息:

使用“%x”,因此:

mdl_打印(“%x”,rec->payload[i])


这将为您提供一个十六进制数,即“必要的长度”。如果需要固定长度,请使用“%02x”表示两个数字,并用零填充

首先,你的标题错了<代码>在C中将整数转换为十六进制转换意味着类型更改,十六进制是数字系统而不是类型。您正在“以十六进制显示整数”,而不是“强制转换”。如果您不理解差异,请要求澄清

至于显示,这取决于您希望结果是什么样的。我通常使用的一条捷径是:

mdl_print("%#x ", rec->payload[i]);
将值显示为:

0xA6
此语法的警告是,它不适用于0,您不会得到
0x0
只是
0
。因此,另一种选择是:

mdl_print("0x%x ", rec->payload[i]);
它将把值显示为
0xA6
0x0
或任何可能的值。当然,如果您不想要
0x
部分,您可以随时执行以下操作:

mdl_print("%x ", rec->payload[i]);
带有无符号8位数字的最大值(十六进制)为
0xFF
,因此如果希望它们都显示相同的“宽度”,也可以使用大小说明符:

mdl_print("%02x ", rec->payload[i]); // or mdl_print("0x%02x, rec->payload[i]); 
                                     // or whatever you picked

请注意,提供
uint8_t
int
,其中printf中预期的
无符号int
是未定义的行为,如n1570.pdf第7.21.6.1p9节所述:“如果任何参数不是相应转换规范的正确类型,则行为未定义。”根据7.21.6.1p8,
%x
告诉printf需要
无符号int
。确保将
uint8\u t
显式强制转换为
(unsigned int)
,或使用
中的
PRIx8

#包括
#包括
#包括
内部主(空){
uint8_t foo=42;
/*这两个printf是等效的:*/
printf(“十六进制表示%02u:%02x\n”,(无符号整数)foo,(无符号整数)foo);
printf(“十六进制表示%02“PRIu8”:%02“PRIx8”\n”,foo,foo);
返回0;
}

mdl\u print()假定采用
printf()
采用的任何格式字符串?是;)我重写是为了我个人的需要,我不认为这个问题值得投反对票。如何正确地将uintnut转换为十进制数字字符串并不十分清楚,这个问题的错误答案的数量就证明了这一点。阅读过7.21.6.1第8页和第9页的人写了多少答案?显然,没有。如果参数的功能类似于标准C中的格式化打印,
mdl_printf(“%x”,(unsigned int)rec->payload[i]),则应显式转换为
unsigned int
。n1570.pdf中7.21.6.1p8的证明:“无符号int参数转换为……无符号十六进制表示法(x或x)”。请阅读同一文档的第7.20节(整数类型)。
uint8\u t
是有效的整数类型,因此不会导致UB@Mike,当这样放置时,
unit8\u t
被转换为
int
,而不是无符号的,所以“可修改左值”是正确的,应该注意这一点。@JensGustedt好的,你能不能再进一步解释一下。7.21.6第8页说,
x
接受一个
无符号int
参数。7.20.1.1(2和3)规定,typedef name
uintN\u t
指定无符号整数类型,实现提供8位作为宽度之一。那么,一个
uint8\u t
怎么不是一个无符号整数呢?符号整数的转换在哪里?显式类型转换解决了这个问题?对于隐式转换,只要所有值都适合,所有窄类型都转换为
int
。顺便说一句,只要在算术表达式中使用窄类型或将其传递给没有原型的函数(例如
printf
),就会应用此转换。@Mike 7.20.1.1p2提到“无符号整数类型”,而不是“
无符号int
”。7.21.6p8特别提到“
无符号整数”。是不是
sizeof(uint8\u t)==sizeof(unsigned int)
?No.6.5.2.2p6意味着整数提升应用于函数调用的参数,如printf。“如果一个int可以表示原始类型的所有值(受位字段宽度的限制),则该值将转换为int;…”因此该参数实际上是一个int。
#include <assert.h>
#include <stdint.h>
#include <stdio.h>

int main(void) {
    uint8_t foo = 42;
    /* These two printfs are equivalent: */
    printf("Hex for %02u: %02x\n", (unsigned int) foo, (unsigned int) foo);
    printf("Hex for %02" PRIu8 ": %02" PRIx8 "\n", foo, foo);
    return 0;
}