#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页)
声明为unsigned的无符号整数应当遵守算术模2n的规律,其中n是该整数大小所表示的位数。这意味着无符号算术不会溢出,因为无法用结果表示的无符号整数类型会被减少到比结果能够表示的无符号整数类型的最大值还要小1的数字。c = 300 % (std::numeric_limits<unsigned char>::max() + 1);
printf
的格式字符串中传递%d
以打印unsigned char
变量。可变参数
的情况下会发生从unsigned char到int的提升转换!
注意:答案的第二部分是对此答案评论所说内容的改述,但不是我的原始答案。
赋值的结果应该是可预测的:
3.9.1
4 声明为unsigned的无符号整数,应当遵守算术模2 n 的规则,其中n是该特定大小的整数的值表示中的位数。17)
17)这意味着无符号算术不会溢出,因为不能由所得的无符号整数类型表示的结果将被模减,模数是可以由所得的无符号整数类型表示的最大值加1。
此外,sizeof(char)定义为1,sizeof(unsigned char)= sizeof(char),因此您应该看到相同的结果,而不管实现方式如何(假设您没有字节大小不同于8的有趣大小)。
然而,警告告诉您结果可能不是您想要的(例如,也许您高估了无符号类型的大小?)。如果这是您想要的,请为什么不写300%(1 << CHAR_BIT)
(假设300对您有某种重要性)?
300%(UCHAR_MAX+1)
,结果当然是有定义的,因为它保证可以被一个int
表示。我为了完整性而添加了上述内容。 - Alok Singhal