在CentOS-5 64位上使用gcc 4.1.2进行编译。
将整数打印为双字符十六进制字符串:
#include <stdio.h>
#include <stdint.h>
int main(void)
{
int8_t iNegVar = -1;
int8_t iPosVar = 1;
printf(" int negative var is <%02X>\n", iNegVar);
printf(" int positive var is <%02X>\n", iPosVar);
return 0;
}
由于该值仅为1个字节,因此我希望整数值为&#39; -1&#39;会打印&#34; 0xFF&#34;。但是,我得到了:
int negative var is <FFFFFFFF>
int positive var is <01>
我尝试将其抽象为char *缓冲区,一次打印1个字节。这产生了相同的结果:
#include <stdio.h>
#include <stdint.h>
void print_hex(void* pBuffer, uint8_t uiBufSize);
int main(void)
{
int8_t iNegVar = -1;
int8_t iPosVar = 1;
printf(" int negative var is <%02X>\n", iNegVar);
print_hex(&iNegVar, 1); //pass by reference
printf(" int positive var is <%02X>\n", iPosVar);
print_hex(&iPosVar, 1); //pass by reference
return 0;
}
void print_hex(void* pBuffer, uint8_t uiBufSize)
{
int i;
char pTmp[3]; //Holds 2-character string, plus NULL
char* pByteBuff = pBuffer; //Use char* to parse byte-by-byte
for(i = 0; i < uiBufSize; i++) //Process all bytes in buffer
{
sprintf(pTmp, "%02X", pByteBuff[i]); //store each byte as 2-character string in "pTmp"
printf(" Converted to %s!\n\n", pTmp);
}
}
打印:
int negative var is <FFFFFFFF>
Converted to FFFFFFFF!
int positive var is <01>
Converted to 01!
我想到了#34; char&#34;在C中实现为整数类型,所以我决定尝试更改&#34; char * pByteBuff&#34; to&#34; unsigned char * pByteBuff&#34;在&#34; print_hex&#34;功能。这很有效,只打印了我期待的两个角色:
int negative var is <FFFFFFFF>
Converted to FF!
虽然这个&#34;固定&#34;我的问题,问题仍然存在:为什么显式打印为双字符十六进制值打印8个字符而不是指定的两个字符?
答案 0 :(得分:3)
因为%x
的默认大小为int
如果您想要char,请使用%hhx
或者更好的是,您拥有macros in <cinttypes>
,例如PRIx8
答案 1 :(得分:3)
int8_t
将通过常规整数提升作为参数传递给printf()
等可变函数。这通常意味着int8_t
转换为int
。
然而"%X"
适用于unsigned
个参数。因此,首先要转换为某些无符号类型,并使用匹配的格式说明符:
对于uint8_t
,请使用PRIX8
。对于精确的宽度类型,请为匹配的说明符包含<inttypes.h>
。
#include <inttypes.h>
printf(" int negative var is <%02" PRIX8 ">\n", iNegVar);`
使用int8_t iNegVar = -1;
,在以十六进制打印之前转换为某些无符号类型
printf(" int negative var is <%02" PRIX8 ">\n", (uint8_t) iNegVar);`
答案 2 :(得分:1)
当您将char
值传递给sprintf()或任何其他可变参数C函数时,在这种情况下,它将被提升为int
值-1。现在您按“%X”规格将其打印为unsigned int
,因此您可以使用FF获得长号。另一方的unsigned char
提升为unsigned int
,因此您获得0xFF整数值,该值打印为2个符号。
注意:在printf()
格式中指定%X - unsigned int的事实仅影响printf函数如何处理传递给它的值。 Char - &gt; int promote在调用printf()
之前发生,格式说明符没有效果,只有你要传递的值的类型。