gcc:warning:大整数隐式截断为无符号类型
#include 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::max() + 1);
其次,在printf
的格式字符串中传递%d
以打印unsigned char
变量。
这个是正确的;)没有未定义的行为,因为在variadic arguments
的情况下,从unsigned char到int的促销转换发生!
注意:答案的第二部分是对这个答案的评论中所说的内容的重新描述,但最初并不是我的答案。
分配的结果应该是可预测的:
3.9.1
4无符号整数,声明无符号整数,应遵守算术模2 n的定律,其中n是整数特定大小的值表示中的位数.17)
17)这意味着无符号算术不会溢出,因为无法由结果无符号整数类型表示的结果以比模式生成的无符号整数类型所表示的最大值大1的数量减少。
另外,sizeof(char)定义为1,sizeof(unsigned char)= sizeof(char),因此无论实现如何,您都应该看到相同的结果(假设您没有8个以外的有趣大小的字节)。
但是,警告告诉您结果可能不是您想要的(例如,您可能高估了无符号类型的大小?)。 如果这就是你的意图,为什么不写300 % (1 << CHAR_BIT)
(假设300对你来说有点重要)?