0

我在这里遇到了一个问题。我输入了一个整数,转换了整数指针并将其发送到一个print_bytes接受char*指针和要打印的字节数的函数中。尝试打印每个字节的地址和十六进制类型的数字。但是对于 250,第一个字节的 o/p 应该是 fa,接下来的 3 个字节应该是零,但是它会打印第一个字节的 fffffffa。

#include<stdio.h>
using namespace std;
void print_bytes(char* ptr,int len)
{
      for(int i=0;i<len;i++)
      {
             printf("%p  %x\n",ptr+i,*(ptr+i));         
      }     
}
int main()
{
      int a=250;
      print_bytes((char*)&a,4);
      return 0;
}

但是当我将指针类型更改为unsigned char*它时,它会给出正确的输出。这意味着 MSB 为 1char*会使输出出错。还是我错过了什么?

4

3 回答 3

0

这是因为(在您的系统上)已签名,并且在通话中char被提升。intprintf()

使用unsigned char

void print_bytes(const unsigned char *ptr, size_t len)
{
  for(size_t i = 0; i < len; ++i)
  {
    printf("%p  %x\n", ptr + i, ptr[i]);
  }
}
于 2013-06-27T09:20:44.077 回答
0
printf("%p  %02x\n",ptr+i,(unsigned char)*(ptr+i));         
于 2013-06-27T09:24:48.780 回答
0

当传递给 printf 函数时,该类型被提升为signed int。当一个有符号类型被提升时,它是“符号扩展的”。

对于 8 位有符号字符,值 250 相当于 -6(2 的补码),因为它是有符号的,所以 -6 被认为是“真”值。当它扩展到一个有符号整数(4 字节)时,就像这里发生的那样,值 -6 被保留(通过符号扩展),而不是值 250。但是 4 字节值上的 -6 是 fffffffa,而它只是一个字节上的 fa 。

由于 MSB 充当标志的标志,因此如果设置了它,您将获得所观察到的行为。

在printf(unsigned char)调用上强制转换将导致该值改为“零扩展”。这将导致保留值 250,而不是值 -6,并将导致您想要的行为。

它是 printf 的要求(由标准设置),作为可变参数函数 (vararg),比 int 窄的参数在传递之前被提升为 int,因此首先是符号扩展。(它还需要将 float 提升为 double)。

于 2013-06-27T09:38:04.093 回答