【问题标题】:gcc: warning: large integer implicitly truncated to unsigned typegcc:警告:大整数隐式截断为无符号类型
【发布时间】:2010-01-27 23:55:22
【问题描述】:
#include<stdio.h>

int main()
{

    unsigned char c;
    c = 300;
    printf("%d",c);
    return 0;
}

输出是可预测的还是未定义的??

【问题讨论】:

    标签: c++ c gcc


    【解决方案1】:

    对不起第一个答案,这里是 C++ 标准的解释:)

    输出是否可以以任何方式预测 还是未定义??

    这是可以预见的。这段代码有两点需要注意: 一、unsigned char类型不能持有的赋值:

    unsigned char c;
    c = 300;
    

    3.9.1 基本类型(第 54 页)

    无符号整数,声明为无符号, 应遵守算术定律 模 2n 其中 n 是 值表示中的位 整数的特定大小。41)
    ...
    41) 这意味着无符号 算术不会溢出,因为 无法表示的结果 得到的无符号整数类型是 减少模数是一 大于最大值 可以用结果来表示 无符号整数类型。

    基本上:

    c = 300 % (std::numeric_limits<unsigned char>::max() + 1);
    

    其次,将%dprintf的格式字符串传递给打印unsigned char变量。
    这个ysth 做对了 ;) 没有未定义的行为,因为在 variadic arguments 的情况下会发生从 unsigned char 到 int 的促销转换!

    注意:答案的第二部分是对the comments of this answer 中所说内容的改写,但它最初不是我的答案。

    【讨论】:

    • “numeric_limit”实际上是“numeric_limits”
    • 如果你喜欢,你必须购买官方文档,或者直接去open-std.org/jtc1/sc22/wg21免费下载最新的草稿:open-std.org/jtc1/sc22/wg21/docs/papers/2009/n3000.pdf
    • 我是这个网站的新手。我只是想知道,你们是怎么知道这么快就被问到这个问题的..:) 你怎么这么快就知道这个问题了?
    • @Shadyabhi 您可以在 StackOverflow 主页右侧的 Interesting Tags 中添加您喜欢的任何“标签”。这些问题将突出显示:)
    • @AraK.. 所以,我的意思是,如果您想成为第一个回答问题的人,您实际上会不断刷新页面..
    【解决方案2】:

    分配的结果应该是可预测的:

    3.9.1

    4 无符号整数,声明为无符号,应遵守算术模 2 的定律n 其中 n 是该特定整数大小的值表示中的位数。17)

    17) 这意味着无符号算术不会溢出,因为不能由得到的无符号整数类型表示的结果以比得到的无符号整数类型可以表示的最大值大一的数字为模减少。

    此外,sizeof(char) 被定义为 1,并且 sizeof(unsigned char) = sizeof(char),因此无论实现如何,您都应该看到相同的结果(假设您没有其他有趣大小的字节8).

    但是,警告告诉您结果可能不是您想要的(例如,您可能高估了无符号类型的大小?)。如果这就是你的意图,为什么不写300 % (1 &lt;&lt; CHAR_BIT)(假设 300 对你来说很重要)?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 2020-01-16
      • 1970-01-01
      • 2016-08-13
      • 2019-06-10
      • 2016-09-28
      • 2013-05-20
      相关资源
      最近更新 更多