C 模运算的结果为负
为什么下面的C代码会产生负数作为输出?我如何防止这种情况发生C 模运算的结果为负,c,math,modulo,negative-number,C,Math,Modulo,Negative Number,为什么下面的C代码会产生负数作为输出?我如何防止这种情况发生 #include <stdio.h> int main() { int i; char buf[1024]; for (i = 0; i < 1024; i++) buf[i] = i%256; for (i=0; i<1024; i++) {
#include <stdio.h>
int main()
{
int i;
char buf[1024];
for (i = 0; i < 1024; i++)
buf[i] = i%256;
for (i=0; i<1024; i++) {
printf("%d ", buf[i]);
if (i%32==31)
printf("\n");
}
}
#包括
int main()
{
int i;
char-buf[1024];
对于(i=0;i<1024;i++)
buf[i]=i%256;
对于(i=0;i让我们看看这行代码:
buf[i] = i%256;
这里,i%256
被计算为类型为int
的值。但是,buf
是一个char
s的数组,因此当该值被分配到数组中时,它被截断为char
。如果模的结果超出了可以存储在char
中的正值范围,它可能会d包装起来并存储为负数
换句话说,不是模数产生了负值,而是将结果存储在一个无法保存它的类型中。尝试将数组更改为int
数组或unsigned char
数组,看看这是否解决了问题
希望这会有所帮助!代码需要使用无符号字符。由于0x7F以上的所有值都设置了符号位,因此可能出现的重复情况并非如此。相反,模运算的结果范围为0到255(0x00到0xFF),0x7F以上的所有结果都被视为负数(字符符号位为“1”)解决方法是使用未签名char@user3629249你所描述的正是我想在这里说的。你能指出我的答案有什么不正确的地方吗?这样我就可以更新它以更清楚地传达发生了什么事?@user3629249-你所写的与templatedypedef在这个答案中所写的非常接近。事实上,什么是templatedypedef WRITED实际上比您所写的更正确,因为答案是“它可能会结束”。标准(第6.2.5节和第6.3.1.1节)明确将普通char
是否签名标记为实现定义的行为。