【问题标题】:C programming - unsigned int overflow problemC编程——无符号整数溢出问题
【发布时间】:2023-03-15 06:38:02
【问题描述】:

我想打印一个整数类型变量,值为3000000000;

所以我写了下面的代码然后运行它,但是打印的值不正确。我认为变量溢出了。但我不知道为什么。

#include<stdio.h>

int main(void) {
    unsigned int num1 = 3000000000;

    printf("%d", num1);
}

据我所知,当代码符合 Win32 API 时,无符号整数类型变量的最大值为 (2^32-1 = 4,294,967,296 - 1)但是打印出来的值是-1294967296。

我不知道为什么我的代码会发生溢出。

如果有人知道原因,请告诉我:)

最好的问候,

  • 我使用 Microsoft Visual Studio 2015 Professional。

【问题讨论】:

  • 试试%u 而不是%d
  • %d 用于签名的ints。它将获取它找到的任何值并将其解释为signed int 并打印它。试试unsigned int num1 = 0xffffffff; printf("%d", num1);。会更加明显。 4294967295 = 0xffffffff

标签: c integer int overflow unsigned


【解决方案1】:

使用%u 而不是%d

对于printf

%d 被以下用户使用:

d, i 将 int 参数转换为有符号十进制表示法。 精度,如果有的话,给出最小位数 必须出现;如果转换后的值需要更少的数字,它 在左边用零填充。默认精度为 1。 当 0 以显式精度 0 打印时,输出为 空。

%u 被以下用户使用:

o, u, x, X unsigned int 参数转换为无符号八进制 (o), 无符号十进制 (u) 或无符号十六进制 (x 和 X) 表示法 化。字母 abcdef 用于 x 转换;让- ters ABCDEF 用于 X 转换。精度,如果 任何,给出必须出现的最小位数;如果 转换后的值需要更少的数字,它被填充在 留下零。默认精度为 1。当为 0 时 以显式精度 0 打印,输出为空。

http://man7.org/linux/man-pages/man3/printf.3.html

【讨论】:

    猜你喜欢
    • 2013-04-10
    • 1970-01-01
    • 2014-12-09
    • 2012-02-29
    • 2021-03-15
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多