int到十六进制转换不适合高值225943正在转换为0x000372ffffff97

时间:2016-11-28 13:55:36

标签: c hex

我的C程序采用随机int高值并将其转换为十六进制并将其写入文件。如果值为225919或更低,一切顺利 例如。 225875是00 03 72 53 但是如果值高于225919,它开始为十六进制值示例885943中的最后一个字节写ffffff 00 03 72 ffffff97,而正确值为00 03 72 97 }。

将值写入文件的代码如下:

char *temp = NULL;
int cze = 225943;
temp = (char *)(&cze);
for (ii = 3; ii >= 0; ii--) {
    printf(" %02x ", temp[ii]);  //just for printing the values
    fprintf(in, "%02x", temp[ii]);
}

输出为:00 03 72 ffffff97

预期输出:00 03 72 97

请帮助,任何指针都表示赞赏。

1 个答案:

答案 0 :(得分:5)

您的temp数组包含char个值,在大多数情况下,这些值表示signed char。然后将这些值打印为带符号char s,因此任何大于0x7f的字节都被视为负值。当该值传递给printf时,它会隐式转换为int。如果数字为负数,则会添加一个或多个包含所有1位的字节。

将数据类型更改为unsigned char。这会导致隐式促销更改为unsigned int,您将获得正确的值。

unsigned char *temp=NULL;
int cze=225943;
temp=(unsigned char *)(&cze);
for(ii=3;ii>=0;ii--){
    printf(" %02x ",temp[ii] );//just for printing the values
    fprintf(in,"%02x",temp[ii]);
}

或者,您可以使用hh中的printf长度修饰符,该修饰符告诉它参数为charunsigned char。这将限制它打印1个字节的数据。

printf(" %02hhx ",temp[ii] );