gpt4 book ai didi

c - 添加超过 0xFFFFFFFF 的有符号整数

转载 作者:行者123 更新时间:2023-11-30 18:26:14 26 4
gpt4 key购买 nike

#include <stdio.h>

void fun3(int a, int b, int c)
{
printf("%d \n", a+b+c );
}
void fun2 ( int x, int y)
{
fun3(0x33333333,0x30303030, 0x31313131);
printf("%d \n", x+y);
}
fun1 (int x)
{
fun2(0x22222222,0x20202020);
printf("%d \n", x);
}
main()
{
fun1(0x1111111);
}

我正在检查上面的堆栈损坏程序。我得到了上述程序的 o/p,其中包含一些不需要的值。我所能理解的是,如果相加的值超过 0xFFFFFFFF,那么小负整数就会变成最大值,比如 -1 就会变成 0xFFFFFFFF。对此有何见解

最佳答案

编辑(更正)(我错过了这一点。我的答案对于常量来说是正确的,但是问题包含函数的参数,那么这里发生的是有符号整数对象的溢出,并且正如正确指出的那样在他的评论中指出@Cornstalks,这是未定义的行为)。/编辑

fun1() 中,您以错误的方式使用 printf()
您编写了 "%d" 来接受 int,但如果您的数字大于 MAX_INT,则情况并非如此。

您必须检查系统中 MAX_INT 的值。
如果您以十六进制格式编写整数常量,标准 C(ISO C99 或 C11)会尝试按照以下顺序将该值放入该常量可以容纳的第一种类型中:

int, unsigned int, long int, unsigned long int, long long int, unsigned long long int.

因此,如果您的常量大于 MAX_INT(int 范围内的最大值),则您的常量(如果为正)的类型为 unsigned int,但指令 %d 需要一个 signed int 值。因此,它将显示一些负数。

最糟糕的是,如果您的常量的值大于 UMAX_INT(unsigned int 范围内的最大值),则常量的类型将是第一个long int、unsigned long int、long long int,精度严格大于unsigned int
这意味着 %d 成为错误的指令。

如果您不能完全确定您的值有多大,您可以强制转换为最大整数类型:

  printf("%lld", (long long int) 0x33333333333);

指令%lld代表long long int
如果您始终对正值感兴趣,则必须使用 %llu 并强制转换为 unsigned long long int:

  printf("%llu", (unsigned long long int) 0x33333333333);

通过这种方式,您可以避免任何“有趣”的数字,就像您在不丢失任何精度的情况下显示大数字一样。

备注:常量INT_MAXUINT_MAX等位于limits.h中。 。

重要提示:自动转换序列仅对八进制和十六进制常量有效。对于十进制常量还有另一个规则:

int, long int, long long int.

关于c - 添加超过 0xFFFFFFFF 的有符号整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18731645/

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