gcc:warning:大整数隐式截断为无符号类型

时间:2010-01-27 23:55:22

标签: c++ c gcc

#include<stdio.h>

int main()
{

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

输出是否可预测或未定义?

2 个答案:

答案 0 :(得分:10)

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

  

输出是否可以预测   或者它的未定义??

这是可以预测的。在此代码中有两点需要注意: 首先,分配unsigned char类型不能容纳的值:

unsigned char c;
c = 300;
  

3.9.1基本类型(页54)

     

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

基本上:

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

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

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

答案 1 :(得分:4)

作业的结果应该是可预测的:

<强> 3.9.1

  

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

     

17)这意味着无符号算术不会溢出,因为无法由结果无符号整数类型表示的结果以比模式生成的无符号整数类型所表示的最大值大1的数量为模。

此外,sizeof(char)定义为1,sizeof(unsigned char)= sizeof(char),因此无论实现如何,您都应该看到相同的结果(假设您没有带有滑稽大小的字节而不是8)。

但是,警告告诉您结果可能不是您想要的(例如,您可能高估了无符号类型的大小?)。如果那是你想要的,为什么不写300 % (1 << CHAR_BIT)(假设300对你来说有点重要)?