C - 以十六进制形式打印负int值会产生太多字符

时间:2015-05-21 15:50:54

标签: c

在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个字符而不是指定的两个字符?

3 个答案:

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