gpt4 book ai didi

c - 使用 char* 和 unsigned char* 打印整数的内存表示形式

转载 作者:行者123 更新时间:2023-11-30 17:50:19 36 4
gpt4 key购买 nike

我在这里遇到了一个问题。我输入了一个整数,转换了整数指针并将其发送到一个函数 print_bytes 中,该函数接受 char* 指针和要打印的字节数。尝试打印每个字节的地址和十六进制类型的数字。但是对于 250,第一个字节的 o/p 应该是 fa,接下来的 3 个字节应该是 0,但它却为第一个字节打印 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* 时,它会给出正确的输出。这意味着 char* 的 MSB 为 1 会导致输出出错。或者我错过了什么?

最佳答案

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

对于 8 位有符号字符,值 250 相当于 -6(2 的补码),并且由于它是有符号的,因此 -6 被视为“真”值。当它扩展为有符号整数(4 字节)时,正如此处所发生的那样,值 -6 被保留(通过符号扩展),而不是值 250。但是 4 字节值上的 -6 是 fffffffa,而它只是单个字节上的 fa。

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

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

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

关于c - 使用 char* 和 unsigned char* 打印整数的内存表示形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17339265/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com