简单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 = (

我正在学习用C编写代码,需要更加熟悉溢出和处理大数。我需要帮助处理以下代码。 这不是我想要的输出,因为当我自己计算时,负数是不正确的。我知道这与我面对的更大的数字有关。我如何着手解决这个问题?我不知道从哪里开始

谢谢

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
)。