gcc:警告:大整数隐式截断为无符号类型 #包括 int main() { 无符号字符c; c=300; printf(“%d”,c); 返回0; } 输出是否以可预测的方式或其未定义??< /p> < p>对不起,第一个答案,这里是C++标准的解释:
产出是否可以预测 还是它的未定义 这是可以预测的。此代码中有两点需要注意: 首先,类型gcc:警告:大整数隐式截断为无符号类型 #包括 int main() { 无符号字符c; c=300; printf(“%d”,c); 返回0; } 输出是否以可预测的方式或其未定义??< /p> < p>对不起,第一个答案,这里是C++标准的解释:,c++,c,gcc,C++,C,Gcc,产出是否可以预测 还是它的未定义 这是可以预测的。此代码中有两点需要注意: 首先,类型unsigned char无法保存的赋值: #include<stdio.h> int main() { unsigned char c; c = 300; printf("%d",c); return 0; } 3.9.1基本类型(第54页) 无符号整数,声明为无符号, 我们必须遵守算术法则 模2n,其中n是 值表示中的位 整数的特定大小。41) … 41)这
unsigned char
无法保存的赋值:
#include<stdio.h>
int main()
{
unsigned char c;
c = 300;
printf("%d",c);
return 0;
}
3.9.1基本类型(第54页)
无符号整数,声明为无符号,
我们必须遵守算术法则
模2n,其中n是
值表示中的位
整数的特定大小。41)…
41)这意味着未签名 算术不会溢出,因为 无法用表示的结果 生成的无符号整数类型为 一个数的约化模 大于指定的最大值 可以由结果 无符号整数类型 基本上:
unsigned char c;
c = 300;
c=300%(标准::数值限制::max()+1);
其次,将%d
以printf
格式字符串传递给printunsigned char
变量。这个是对的;)没有未定义的行为,因为在
可变参数的情况下会发生从无符号字符到int的升级转换
注意:答案的第二部分是对中所说内容的重新表述,但它不是我最初的答案。作业的结果应该是可预测的:
3.9.1
4个无符号整数,声明为无符号,应遵守算术模2n定律,其中n是该特定整数大小的值表示中的位数。17)
17) 这意味着无符号算术不会溢出,因为无法由结果无符号整数类型表示的结果将以大于结果无符号整数类型可以表示的最大值一的数字的模减少
此外,sizeof(char)被定义为1,sizeof(unsigned char)=sizeof(char),因此无论实现如何,您都应该看到相同的结果(假设您没有大小为8以外的字节)
但是,警告告诉您结果可能不是您想要的(例如,可能您高估了无符号类型的大小?)。如果这是你想要的,为什么不写300%(1“numeric_limit”实际上是“numeric_limits”如果你愿意,你必须购买官方文件,或者直接去免费下载最新的草稿:我是这个网站的新手。我只想知道,你的人是如何快速了解这个问题的……)为什么你这么快就被提醒了这个问题?@Shadyabhi你可以在StackOverflow主页右侧的有趣标签中添加任何你喜欢的“标签”。这些问题将突出显示:)@AraK。。所以,我的意思是,如果你想成为第一个回答这个问题的人,你实际上一直在刷新页面。。
c = 300 % (std::numeric_limits<unsigned char>::max() + 1);