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()
调用和格式说明符没有效果之前发生,只有你传递的值的类型。