【发布时间】:2010-01-27 23:55:22
【问题描述】:
#include<stdio.h>
int main()
{
unsigned char c;
c = 300;
printf("%d",c);
return 0;
}
输出是可预测的还是未定义的??
【问题讨论】:
#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) 这意味着无符号 算术不会溢出,因为 无法表示的结果 得到的无符号整数类型是 减少模数是一 大于最大值 可以用结果来表示 无符号整数类型。
基本上:
c = 300 % (std::numeric_limits<unsigned char>::max() + 1);
其次,将%d以printf的格式字符串传递给打印unsigned char变量。
这个ysth 做对了 ;) 没有未定义的行为,因为在 variadic arguments 的情况下会发生从 unsigned char 到 int 的促销转换!
注意:答案的第二部分是对the comments of this answer 中所说内容的改写,但它最初不是我的答案。
【讨论】:
分配的结果应该是可预测的:
3.9.1
4 无符号整数,声明为无符号,应遵守算术模 2 的定律n 其中 n 是该特定整数大小的值表示中的位数。17)
17) 这意味着无符号算术不会溢出,因为不能由得到的无符号整数类型表示的结果以比得到的无符号整数类型可以表示的最大值大一的数字为模减少。
此外,sizeof(char) 被定义为 1,并且 sizeof(unsigned char) = sizeof(char),因此无论实现如何,您都应该看到相同的结果(假设您没有其他有趣大小的字节8).
但是,警告告诉您结果可能不是您想要的(例如,您可能高估了无符号类型的大小?)。如果这就是你的意图,为什么不写300 % (1 << CHAR_BIT)(假设 300 对你来说很重要)?
【讨论】: