C – 以hexforms打印负int值会产生太多字符

在CentOS-5 64位上使用gcc 4.1.2进行编译。

将整数打印为双字符hex字符串:

#include  #include  int main(void) { int8_t iNegVar = -1; int8_t iPosVar = 1; printf(" int negative var is \n", iNegVar); printf(" int positive var is \n", iPosVar); return 0; } 

由于该值仅为1个字节,我希望整数值“-1”将打印“0xFF”。 但是,我得到:

  int negative var is  int positive var is  

我尝试将其抽象为char *缓冲区,一次打印1个字节。 这产生了相同的结果:

 #include  #include  void print_hex(void* pBuffer, uint8_t uiBufSize); int main(void) { int8_t iNegVar = -1; int8_t iPosVar = 1; printf(" int negative var is \n", iNegVar); print_hex(&iNegVar, 1); //pass by reference printf(" int positive var is \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  Converted to FFFFFFFF! int positive var is  Converted to 01! 

我认为“char”在C中实现为整数类型,因此我决定尝试在“print_hex”函数中将“char * pByteBuff”更改为“ unsigned char * pByteBuff”。 这很有效,只打印了我期待的两个字符:

 int negative var is  Converted to FF! 

虽然这个“修复”了我的问题,但问题仍然存在:为什么显式打印为双字符hex值会打印8个字符而不是指定的两个字符?

int8_t将通过常规的整数提升作为int8_t函数的参数,如printf() 。 这通常意味着int8_t被转换为int

然而, "%X"是指unsigned参数。 所以首先隐藏到一些无符号类型并使用匹配的格式说明符:

对于uint8_t ,使用PRIX8 。 对于精确的宽度类型,请为匹配的说明符包含

 #include  printf(" int negative var is <%02" PRIX8 ">\n", iNegVar);` 

使用int8_t iNegVar = -1; ,以hex打印前转换为某些无符号类型

 printf(" int negative var is <%02" PRIX8 ">\n", (uint8_t) iNegVar);` 

这是因为%x默认大小为int。
如果你想要char,请使用%hhx
或者更好的是,你有的宏 ,就像PRIx8一样

char值传递给sprintf()或任何其他可变参数C函数时,在这种情况下将其提升为int值-1。 现在您通过“%X”规范将其打印为unsigned int ,因此您可以使用FF获得长号。 另一端的unsigned char提升为unsigned int因此得到0xFF整数值,打印为2个符号。

注意:在printf()格式中指定%X – unsigned int的事实仅影响printf函数如何处理传递给它的值。 Char – > int promote在printf()调用和格式说明符没有效果之前发生,只有你传递的值的类型。