gpt4 book ai didi

c++ - 为什么 visual studio 为 char -1 打印 FFFFFFFF?

转载 作者:行者123 更新时间:2023-11-30 02:14:32 26 4
gpt4 key购买 nike

我想知道为什么 Visual Studio 打印 FFFFFFFF 作为下面函数的输出而不是 FF。 printf 似乎忽略了格式字符串中的宽度说明符,为什么?

要修复它,我必须添加 c & 0xff 或将 c 更改为 unsigned char。但我仍然想了解这种异常行为。

#include <stdio.h>

int main()
{
char c = -1;
printf("%02X\n", c);
}

最佳答案

char c = -1;
printf("%02X\n", c);

这有未定义的行为。

%X 格式需要一个类型为 unsigned int 的参数。您正在传递 char 类型的参数,它(几乎可以肯定)被提升为 int

因此,您正在打印一个 int 类型的值,其值超出预期类型 unsigned int 的范围。这是您获得未定义行为的地方。

(没有可移植的方法以十六进制打印带符号的整数类型,除非您编写自己的代码来执行此操作。%x%X,它们以十六进制打印, 需要一个无符号参数。十进制格式是 %d 有符号和 %u 无符号。)

请注意,char 类型本身在某些实现中可能是无符号的,因此您的初始化

char c = -1;

没有未定义的行为,但它可以在 c 中存储实现定义的值(可能 255)。

如果您想以十六进制打印一个字节值,您可能想要使用unsigned char 而不是普通的char。在将它传递给 printf 时,您需要将其转换为预期的类型,因为 unsigned char 也(几乎可以肯定)被提升为 (signed) int )。

unsigned char c = 255;
printf("c = %02X\n", (unsigned int)c);

如果你想打印一个十六进制的 char 值,你可以使用这个稍微复杂的代码: 字符 c = -1; printf("c = %02X\n", (unsigned char)c);

转换为 unsigned char 确保值在 0..255 范围内;确保值不会从 char 提升为 intunsigned char 值被提升为 int,然后 %02X 将其视为 unsigned int 值格式。 (intunsigned int 参数可以互换,但仅适用于两种类型范围内的值。)

关于c++ - 为什么 visual studio 为 char -1 打印 FFFFFFFF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57666197/

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