简单C程序中的溢出
我正在学习用C编写代码,需要更加熟悉溢出和处理大数。我需要帮助处理以下代码。 这不是我想要的输出,因为当我自己计算时,负数是不正确的。我知道这与我面对的更大的数字有关。我如何着手解决这个问题?我不知道从哪里开始 谢谢简单C程序中的溢出,c,overflow,unsigned,unsigned-integer,mod,C,Overflow,Unsigned,Unsigned Integer,Mod,我正在学习用C编写代码,需要更加熟悉溢出和处理大数。我需要帮助处理以下代码。 这不是我想要的输出,因为当我自己计算时,负数是不正确的。我知道这与我面对的更大的数字有关。我如何着手解决这个问题?我不知道从哪里开始 谢谢 int main() { unsigned A = 1103624256; unsigned B = 11254; unsigned X = 1; unsigned max_unsigned = (long)(UINT_MAX); X = (
int main() {
unsigned A = 1103624256;
unsigned B = 11254;
unsigned X = 1;
unsigned max_unsigned = (long)(UINT_MAX);
X = ((A*X)+B)%max_unsigned;
printf("X1 =\t%d\n", X);
X = ((A*X)+B)% max_unsigned;
printf("X2 =\t%d\n",X);
X = ((A*X)+B)%max_unsigned;
printf("X3 =\t%d\n", X);
X = ((A*X)+B)% max_unsigned;
printf("X4 =\t%d\n",X);
return 0;
}
我的输出是:
X1 = 1103635510
X2 = 823626102
X3 = -473507466
X4 = -1793402506
Program ended with exit code: 0
您不能使用32位类型来保存有符号的
int
和unsigned int
的整个范围,但可以使用更大的类型,例如long-long
。我是否应该将所有变量强制转换为long-long?当计算溢出时,您会得到与实现相关的结果,通常是负数。负%正数返回负数。将a*X
中的一个变量强制转换为long
,然后它将传播到表达式的其余部分。您需要使用%max\u unsigned
而不是使用&max\u unsigned
,因为前者只会从[0
,max_unsigned
)(或0
至max_unsigned-1
)。