【问题标题】:Printing maximum values of INT打印 INT 的最大值
【发布时间】:2014-10-05 20:21:27
【问题描述】:

我尝试在程序中打印int 的最大值。 使用以下代码::

#include <stdio.h>
#include <limits.h>
int main(void) {
    printf("%d",INT_MAX);
    return 0;
}

我得到的输出是::2147483647

但是,当我将printf 语句更改为printf("%lld",INT_MAX); 时,我的输出变为577732524332023807INT_MAX的值应该在long long int的范围内,那为什么不能将INT_MAX转换成long long int中的正确数字。

提前感谢您的帮助。

【问题讨论】:

    标签: c int long-long


    【解决方案1】:

    printf 是一个可变参数函数,它不知道它的参数类型,它依赖于接收格式字符串中的正确提示。

    您使用"%lld" 调用了未定义的行为,因为您没有传递long long int

    要修复它,您需要强制转换 - 然后您会看到正确的结果:

    printf("%lld", (long long int) INT_MAX);
    

    启用编译器警告? :)

    【讨论】:

    • 非常感谢.. :) 先生还有一件事是long intint 一样吗?因为我尝试打印printf("%ld",LONG_MAX);,但它提供与printf("%d",INT_MAX);相同的输出,但它提供相同的输出..有什么理由吗? :\
    • @user007:我们说这种行为是实现定义的。尝试比较sizeof(int)sizeof(long)。对于您的编译器,它们应该具有相同的值(以字节数计),但 C 标准仅规定 sizeof(int) &lt;= sizeof(long int) 并要求 int 至少为 2 个字节,long int 至少为 4 个字节。
    • @GrzegorzSzpetkowski 如果它们与几个编译器具有相同的大小,那么如果它们可以保存相同的值,那么拥有 2 种不同的数据类型有什么用?我猜我们也不能在 long int 而不是 int 上执行任何特殊功能,因为它们都是数字..
    • @user007:不。 en.cppreference.com/w/cpp/language/variadic_arguments "bool、char、short 和 unscoped 枚举被转换为 int 或更宽的整数类型,如整数提升"
    【解决方案2】:

    %lldint 的规范不正确。根据标准,这是未定义的行为:

    7.21.6.1 fprintf 函数

    ....

    如果有任何参数 不是相应转换规范的正确类型,行为是 未定义。


    7.21.6.3 printf 函数

    ....

    printf 函数等价于插入参数 stdoutfprintfprintf 的参数之前。

    【讨论】:

    • 如果我写 printf("%lld",2); 会被定义吗??
    • @user007 不,未定义。格式规范与类型不匹配。
    • 嗨,我刚刚遇到了与这个问题相关的事情stackoverflow.com/questions/1472581/…这不也是未定义的行为吗?使用%d 打印char ???这个问题的第一个答案。
    【解决方案3】:

    您在调用函数时将 4 个字节的数据(int-length)压入堆栈,然后告诉函数从调用堆栈中消耗 8 个字节来打印它。所以你的值后面有 4 个字节的垃圾。

    您可以告诉编译器对此进行检查。

    【讨论】:

      猜你喜欢
      • 2018-04-09
      • 1970-01-01
      • 2015-02-20
      • 2012-01-16
      • 2019-05-26
      • 1970-01-01
      • 2010-12-23
      • 2012-03-03
      • 1970-01-01
      相关资源
      最近更新 更多