繁体   English   中英

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

[英]gcc: warning: large integer implicitly truncated to unsigned type

#include<stdio.h>

int main()
{

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

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

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

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

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

unsigned char c;
c = 300;

3.9.1基本类型(页54)

声明无符号的无符号整数应遵守算术模2n的定律,其中n是整数特定大小的值表示中的位数.41)
...
41)这意味着无符号算术不会溢出,因为无法由结果无符号整数类型表示的结果以比模式生成的无符号整数类型所表示的最大值大1的数量减少。

基本上:

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

其次,在printf的格式字符串中传递%d以打印unsigned char变量。
这一个YSTH了它的权利;)没有未定义的行为,因为无符号的字符为INT促销转化率的情况下发生的variadic arguments

注意:答案的第二部分就是已经有人说的改述 这个答案的评论 ,但它不是我的回答原来。

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

3.9.1

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM