【发布时间】:2014-06-30 10:07:41
【问题描述】:
这是代码:目标是判断所有数组成员的总和是正数还是负数。我知道 unsigned int 是一个错误,因为我想看看它会打印什么。所以问题是为什么它打印负数,我的意思是,将负 int 分配给 unsigned int 正在做什么。
#include <stdio.h>
#define ARR_SIZE 5
int main() {
int array[ARR_SIZE] = {1,-2,3,4,-5};
unsigned sum;
int i;
for ( i = 0, sum=0; i < ARR_SIZE; i++ )
sum += array[i];
if( sum > -1 ) printf ("non-negative");
else printf ("negative");
return 0;
}
【问题讨论】:
-
无符号整数溢出是根据
CHAR_BIT * sizeof(unsigned)的模 2 定义的。 -
注意到将负值分配给无符号变量的可能性是不寻常的。在这种情况下发生的隐式转换完全由 C 语言定义。根据模运算规则将值带入目标无符号类型的范围。模等于 2^N,其中 N 是无符号接收者中的值位数。这就是它在 C 中的一贯做法。
-
您的编译器应该发出警告,表明您正在比较行
if( sum > -1 ) …的不同符号的表达式(-1的类型为int,sum是unsigned int)。如果没有,请在进一步努力之前找到如何启用此警告。
标签: c