Tag: 整数溢出

没有有用和可靠的方法来检测C / C ++中的整数溢出?

不,这不是如何检测整数溢出的重复? 。 问题是一样的,但问题是不同的。 gcc编译器可以优化掉溢出检查(使用-O2),例如: int a, b; b = abs(a); // will overflow if a = 0x80000000 if (b < 0) printf("overflow"); // optimized away gcc人认为这不是一个错误。 根据C标准,溢出是未定义的行为,它允许编译器执行任何操作 。 显然, 任何事情都包括假设溢出永远不会发生。 不幸的是,这允许编译器优化掉溢出检查。 最近的CERT文件中描述了检查溢出的安全方法。 本文建议在添加两个整数之前执行类似的操作: if ( ((si1^si2) | (((si1^(~(si1^si2) & INT_MIN)) + si2)^si2)) >= 0) { /* handle error condition */ } else { sum = […]

将INT_MAX转换为float然后再返回整数。

在C编程中,我发现了一个奇怪的问题,这反驳了我的直觉。 当我将一个integer声明为INT_MAX ( INT_MAX ,在limits.h中定义)并将其隐式转换为float值时,它工作正常,即浮点值与最大整数相同。 然后,我将浮点数转换回整数,发生了一些有趣的事情。 新integer变为最小整数( -2147483648 )。 源代码如下所示: int a = INT_MAX; float b = a; // b is correct int a_new = b; // a_new becomes INT_MIN 我不确定当浮点数b转换为整数a_new时会发生什么。 那么,有没有合理的解决方案来找到可以在integer和float类型之间切换回来的最大值? PS: INT_MAX – 100的值工作正常,但这只是一个随意的解决方法。

如何计算(a次b)除以c仅使用32位整数类型,即使b次不适合这种类型

请考虑以下内容作为参考实现: /* calculates (a * b) / c */ uint32_t muldiv(uint32_t a, uint32_t b, uint32_t c) { uint64_t x = a; x = x * b; x = x / c; return x; } 我感兴趣的是一个不需要64位整数类型的实现(在C或伪代码中)。 我开始草拟一个如下概述的实现: /* calculates (a * b) / c */ uint32_t muldiv(uint32_t a, uint32_t b, uint32_t c) { uint32_t d1, d2, […]

在stdint.h中定义的C99签名整数类型是否在溢出的情况下表现出良好定义的行为?

对于C(short,int,long等)中的“标准”有符号整数类型的所有操作,如果它们产生超出[TYPE_MIN,TYPE_MAX]间隔的结果(其中TYPE_MIN,TYPE_MAX是最小值和最大整数值),则表现出未定义的行为可以通过特定整数类型存储的。 但是,根据C99标准,所有intN_t类型都需要具有二进制补码表示: 7.8.11.1精确宽度整数类型 1. typedef名称intN_t指定有符号整数类型,其宽度为N,没有填充位和二进制补码表示。 因此,int8_t表示宽度恰好为8位的有符号整数类型。 这是否意味着C99中的intN_t类型在整数溢出的情况下表现出良好定义的行为? 例如,这段代码定义明确吗? #include #include #include int main(void) { printf(“Minimum 32-bit representable number: %” PRId32 “\n”, INT32_MAX + 1); return 0; }

什么是C中的算术下溢和溢出?

算术下溢和溢出在C编程中意味着什么?

如何检查C中的整数溢出?

可能重复: 在C / C ++中检测整数溢出的最佳方法 有(1): // assume x,y are non-negative if(x > max – y) error; 并且(2): // assume x,y are non-negative int sum = x + y; if(sum < x || sum < y) error; 哪个是首选或有更好的方法。

在C中包含有符号和无符号变量的解释?

我在C规范中读到了一点,无符号变量(特别是unsigned short int )在整数溢出上执行一些所谓的回绕,尽管除了我留下未定义的行为之外我找不到任何有符号的变量。 我的教授告诉我他们的价值观也被包围了。(也许他只是意味着gcc)我认为这些比特被截断了,我留下的位给了我一些奇怪的价值?! 那么,任何人都可以解释什么是环绕的,它与截断位有什么不同。