gpt4 book ai didi

C 操作无符号整数 - 整数溢出

转载 作者:太空宇宙 更新时间:2023-11-04 06:26:21 26 4
gpt4 key购买 nike

我在简单的 C 程序中试验 unsigned int 数据类型和主要方法参数。作为实验,我编写了一个程序,该程序从命令行获取一个 int 数字作为 main 方法的参数,并对该数字和 0 之间的每个整数求和。

例如程序计算f(n) = (1 + 2 + 3... + n) n > 0时有效

#include <stdio.h>
#include <stdlib.h>

const unsigned int MAX_NUM = 92681; //Max input that will avoid int overflow later on

unsigned int sum(unsigned int x);

int main(int argc, char *argv[]) {

unsigned int input = atoi(argv[1]);

if (input < 0 || input > MAX_NUM) {
printf("Invalid input! Input must be less than 92682\n");
exit(0); //If input > MAX_NUM, quit program
}

unsigned int result = sum(input);

printf("Sum to %d = %d\n", input, result);

return 0;
}

unsigned int sum(unsigned int x) {
unsigned int sum = 0;
unsigned int y;
for (y = 0; y <= x; y++) {
sum += y;
printf("Current sum:\t%u\n",sum);
}
return sum;
}

我开始注意到的第一件事是当 f(n) > 2147483648(也就是有符号整数的最大值)时整数溢出。

我手工找到了我的程序生成的结果有效的最大值(例如,在整数溢出之前),有符号整数为 65535,无符号整数为 92681。

为有符号整数运行程序产生了预期的结果 - 在 65535 处,由于整数溢出,非常大的正数变成了非常大的负数。

然后我仔细检查并将每个“int”更改为“unsigned int”。尽管有这个整数溢出,但就像整数是有符号的而不是无符号的一样。

我的问题是 a) 这是为什么? b) 我怎样才能使我的答案可以使用整个范围的无符号整数,即 0 到 (2^32) - 1(因为我不需要负值!)。

非常感谢!

最佳答案

您忘记更改最后的 printf格式从有符号到无符号。

改变:

printf("Sum to %d = %d\n", input, result);

到:

printf("Sum to %u = %u\n", input, result);
^^ ^^

请注意,启用编译器警告(例如 gcc -Wall ...)会提醒您注意这一点。始终启用编译器警告并始终注意它们。

关于C 操作无符号整数 - 整数溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26370073/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com