gpt4 book ai didi

c++ - 使用 %u 读取签名的字符

转载 作者:可可西里 更新时间:2023-11-01 17:08:47 30 4
gpt4 key购买 nike

#include <stdio.h>

int main() {
int i,n;
int a = 123456789;

void *v = &a;

unsigned char *c = (unsigned char*)v;

for(i=0;i< sizeof a;i++) {
printf("%u ",*(c+i));
}

char *cc = (char*)v;
printf("\n %d", *(cc+1));

char *ccc = (char*)v;
printf("\n %u \n", *(ccc+1));

}

此程序在我的 32 位 Ubuntu 机器上生成以下输出。

21  205  91  7  
-51
4294967245

前两行输出我能看懂=>

  • 第一行:字节在内存中的存储顺序。
  • 第二行:第二个字节值的有符号值(2 的补码)。
  • 第三行:为什么这么大的值(value)?

请解释最后一行输出。为什么要添加三个字节的 1因为 (1111111111111111111111111001101) = 4294967245

最佳答案

显然你的编译器使用带符号的字符,它是小端,二进制补码系统。

123456789d = 075BCD15h
Little endian: 15 CD 5B 07

因此 v+1 给出值 0xCD。当它存储在带符号的字符中时,您将得到带符号的十进制格式的 -51

当传递给 printf 时,包含值 -51 的字符 *(ccc+1) 首先被隐式类型提升为 int,因为像 printf 这样的可变参数函数有一条规则,规定所有小整数参数将被提升为 int(默认参数提升)。在此促销期间,标志被保留。您仍然有值 -51,但对于 32 位有符号整数,这给出值 0xFFFFFFCD

最后 %u 说明符告诉 printf 将其视为无符号整数,因此您最终得到 42.9 亿。

这里要理解的重要部分是 %u 与实际的类型提升无关,它只是告诉 printf 提升后如何解释数据。

关于c++ - 使用 %u 读取签名的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36350405/

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