我对编码很新,并且对我最近遇到的程序的输出有疑问。这是代码:
#include <stdio.h>
int main(void) {
unsigned char x = 16;
x = x * 16;
if (x) {
printf("True.\n");
}
else {
printf("False.\n");
}
return 0;
}
这个程序的输出显然是&#34;错误。\ n&#34;。我有两个问题:
谢谢!任何建议或提示都非常感谢。
答案 0 :(得分:4)
unsigned char x = 16;
x
是unsigned char
,其范围为[0, 255]
。
x = x * 16;
C99 standard(§6.2.5/9
)状态
涉及无符号操作数的计算永远不会过度流动,因为无法用结果无符号整数类型表示的结果会以比结果类型可以表示的最大值大1的数量为模。
x
等于16 * 16 % 256 = 256 % 256 = 0
。
if (x) {
对于不等于零的值,此语句应为true
。
对于等于零的值,此语句应为false
,这是您的情况。
答案 1 :(得分:3)
x
没有溢出。
unsigned x
的值为16.作为乘法的一部分,int
转换为int * int
,代码生成int 256
,其乘积为256 - 无溢出。
现在unsigned char
已分配给unsigned char
。当某些无符号整数类型被赋予超出其范围的值时,该值将在&#34; max + 1&#34;中减少/增加。步骤,或256,直到它在范围内,因为OP平台上的if(something)
的最大值是255.再次,没有溢出。值为0.
如果条件语句的参数只是一个变量,这意味着什么? 为什么输出&#34;错误。\ n&#34;?
如果something
等于0,则if (x) {
//
if (0) {
//
if (false) {
... // irrelevant
} else {
printf("False.\n");
}
false ,其他所有内容均为 true 。
row[7]