c++ - Printf 函数格式化程序

标签 c++ integer printf overflow implicit-conversion

有以下简单的C++代码:

#include <stdio.h>

int main() {
    char c1 = 130;
    unsigned char c2 = 130;

    printf("1: %+u\n", c1);
    printf("2: %+u\n", c2);
    printf("3: %+d\n", c1);
    printf("4: %+d\n", c2);
    ...
    return 0;
}

输出是这样的:

1: 4294967170
2: 130
3: -126
4: +130

有人可以向我解释第 1 行和第 3 行的结果吗?

我正在使用所有默认设置的 Linux gcc 编译器。

最佳答案

(这个答案假设,在你的机器上,char 的范围从 -128 到 127,unsigned char 的范围从 0 到 255,unsigned int 的范围从 0 到 4294967295,这恰好是这种情况.)

char c1 = 130;

此处,130 超出了 char 可表示的数字范围. c1 的值是实现定义的。在您的情况下,数字恰好“环绕”,初始化 c1static_cast<char>(-126) .

printf("1: %+u\n", c1);

c1被提升为int ,导致 -126 .然后,它由 %u 解释说明符为 unsigned int .这是未定义的行为。这次得到的数字恰好是由 unsigned int 表示的唯一数字。这与 -126 模 4294967296 一致,即 4294967170。

printf("3: %+d\n", c1);

int-126%d 解释说明符为 int直接,并按预期输出 -126 (?)。

关于c++ - Printf 函数格式化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56424618/

相关文章:

c++ - 有没有办法从 C++ 中的枚举类中获取随机数?

c++ - 使用就地 lambda 进行复杂的初始化,尤其是 const

python - 过滤 Pandas 数据框列中的字符串/ float /整数值

java - 在 for 循环中交换整数数组值 - 这可能吗?

代码块 MinGW 和 %n 转换字符

c++ - 如何在 QT QWidgets C++ 中围绕其中心旋转图像?

c++ - 关于(单元)测试的好 C++ 书籍

mysql - 获取整数后跟字符串

c - 为什么使用 "%s"格式说明符 printf 一个字符数组会在数组中的最后一个字符之后输出额外的无意义值?

c - 调试竞争条件时打印信息的最佳方式