gpt4 book ai didi

c - 在 C 中打印时有符号和无符号字符的行为

转载 作者:太空狗 更新时间:2023-10-29 16:01:18 25 4
gpt4 key购买 nike

我在 Windows 7 上的 Code::Blocks 10.05 中编译了以下 C 程序。

int main()
{
unsigned char a=-5;
signed char b=-5;
char c=-5;
printf("%d %d %d \n",a,b,c);
printf("%u %u %u \n",a,b,c);
}

我期待以下输出

251 -5 -5
251 251 251

我是这样推理的,

-5在2的补码中表示为1111 1011。因此将打印 251。

但我得到了以下输出。

251 -5 -5 
251 4294967291 4294967291

我知道 4294967291 是 -5 的 32 位 2 的补码表示。

但为什么 unsigned char a 打印为 251 而不是 4294967291?

最佳答案

printf是一个可变参数函数,它导致(感谢@TheParamagneticCroissant 的更正)积分参数被提升为 int 或 unsigned int。其中根据标准的推广规则将签署适当扩展它们。这导致您得到的数字是此促销过程后的结果。

相反,您可以使用 "%" PRIu8打印 8 位无符号和 "%" PRId8打印 8 位有符号数。但是请注意,参数仍将被提升,然后 printf 将根据格式说明符再次向下转换它们,这可能仍会更改该值,但我从内存中不确定。

此外,C 中不保证 char 为 8 位,最好包括 <stdint.h> header 并使用适当的固定宽度类型。

您的代码的固定版本如下:

#include <stdint.h>
int main()
{
uint8_t a=-5;
int8_t b=-5;
printf("%" PRId8 "%" PRId8 "\n", a, b);
printf("%" PRIu8 "%" PRIu8 "\n", a, b);
}

请注意,我不包括 char 的等价物,因为所有固定宽度类型都具有已定义的符号,因此没有 char 的直接等价物,它具有 undefined symbol 。

关于c - 在 C 中打印时有符号和无符号字符的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31758836/

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