gpt4 book ai didi

c - 如何以编程方式确定 C 中 int 数据的最大和最小限制?

转载 作者:太空狗 更新时间:2023-10-29 17:09:53 25 4
gpt4 key购买 nike

我正在尝试 K&R 的练习 2.1。练习内容如下:

Write a program to determine the ranges of char, short, int, and long variables, both signed and unsigned, by printing appropriate values from standard headers and by direct computation. Harder if you compute them: determine the ranges of the various floating-point types.

在标准 header 中打印常量值很容易,就像这样(例如只显示整数):

printf("Integral Ranges (from constants)\n");
printf("int max: %d\n", INT_MAX);
printf("int min: %d\n", INT_MIN);
printf("unsigned int max: %u\n", UINT_MAX);

但是,我想以编程方式确定限制。

我试过这段代码,它看起来应该可以工作,但实际上它进入了一个无限循环并卡在那里:

printf("Integral Ranges (determined programmatically)\n");

int i_max = 0;

while ((i_max + 1) > i_max) {
++i_max;
}

printf("int max: %d\n", i_max);

为什么会卡在一个循环里?看起来当一个整数溢出时它会从 2147483647 跳到 -2147483648。增加的值明显小于之前的值,因此循环应该结束,但实际上并没有。

最佳答案

好的,我正要写评论,但是太长了...

你可以使用 sizeof

如果为真,则有一种简单的方法可以找到任何类型的最大值:

例如,我将找到一个整数的最大值:

定义:INT_MAX = (1 << 31) - 1对于 32 位整数 (2^31 - 1)

如果我们使用整数来计算 int max,前面的定义会溢出,所以,它必须适本地调整:

INT_MAX = (1 << 31) - 1
= ((1 << 30) * 2) - 1
= ((1 << 30) - 1) * 2 + 2) - 1
= ((1 << 30) - 1) * 2) + 1

并使用 sizeof :

INT_MAX = ((1 << (sizeof(int)*8 - 2) - 1) * 2) + 1

只需阅读每种类型的规则,您就可以对任何有符号/无符号类型执行相同的操作。

关于c - 如何以编程方式确定 C 中 int 数据的最大和最小限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31897880/

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