- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用 errno
来检测我是否执行了导致溢出的操作。然而,尽管我编写了一个故意溢出的函数,errno == ERANGE
是错误的。这是怎么回事?
代码如下:
#include <stdio.h>
#include <errno.h>
int main(int argc, char* argv[]) {
unsigned char c = 0;
int i;
for (i = 0; i< 300; i++) {
errno = 0;
c = c + 1;
if (errno == ERANGE) {// we have a range error
printf("Overflow. c = %u\n", c);
} else {
printf("No error. c = %u\n", c);
}
}
return 0;
}
我预计这会在我们将 1 加到 255 的地方给出一个溢出错误,但是没有错误。这是(截断的)输出:
No error. c = 245
No error. c = 246
No error. c = 247
No error. c = 248
No error. c = 249
No error. c = 250
No error. c = 251
No error. c = 252
No error. c = 253
No error. c = 254
No error. c = 255
No error. c = 0
No error. c = 1
No error. c = 2
No error. c = 3
No error. c = 4
No error. c = 5
No error. c = 6
No error. c = 7
No error. c = 8
No error. c = 9
有人可以解释为什么它没有检测到错误,以及我如何更改它或以其他方式制作一个可以检测我的值是否溢出的函数?注意:最终我想用 long int
来做这件事,所以不可能简单地将它转换成更大的数据类型。
编辑:
从那以后,我发现了一些简单的函数来分别检测整数数据类型的加法和乘法溢出。它并未涵盖所有情况,但涵盖了很多情况。
乘法:
int multOK(long x, long y)
/* Returns 1 if x and y can multiply without overflow, 0 otherwise */
{
long p = x*y;
return !x || p/x == y;
}
有符号的加法:
int addOK(long x, long y)
/* Returns 1 if x and y can add without overflow, 0 otherwise */
{
long sum = x+y;
int neg_over = (x < 0) && (y < 0) && (sum >= 0);
int pos_over = (x >= 0) && (y >= 0) && (sum < 0);
return !neg_over && !pos_over;
}
无符号加法:
int unsignedAddOK(unsigned long x, unsigned long y)
/* Returns 1 if x and y can add without overflow, 0 otherwise */
{
unsigned long sum = x+y;
return sum > x && sum > y;
}
最佳答案
Errno不是处理器设置变量,它只被系统调用和一些标准函数用来报告错误。
除了验证 c < c + 1
是否存在外,我不知道有什么技术可以检测您的要求。在每次循环迭代中。
编辑:经过一些研究,我找到了 this关于状态寄存器的维基百科,它是指示此类错误的 CPU 标志。
关于c - 发生溢出,但 errno 不是 ERANGE。这是怎么发生的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12869006/
在 Visual Studio 2013 中,我有以下测试代码: #include #include #include #include int main ( int argc, const
这个问题在这里已经有了答案: Correct usage of strtol (5 个答案) 关闭 2 年前。 我一直在尝试使用 strtol 将 char 数组正确转换为 long,检查是否存在上
errno 值 ERANGE 被 POSIX 记录为 Result too large. 和EOVERFLOW被记录为 Value too large to be stored in data typ
此程序在第一个命令行参数上调用 strtod() 并打印返回值: #include #include #include #include int main(int argc, char **a
我正在尝试使用 errno 来检测我是否执行了导致溢出的操作。然而,尽管我编写了一个故意溢出的函数,errno == ERANGE 是错误的。这是怎么回事? 代码如下: #include #incl
我刚刚注意到,当我的代码使用 Visual C++ 2013 编译时,当目标缓冲区太小时,_snprintf 函数将 errno 设置为 ERANGE(结果太大)。这似乎没有记录在案: https:/
我很困惑 errno 没有被设置为 ERANGE之后 strtod()尝试将具有巨大实数的字符串转换为双浮点数。 这是我运行代码时发生的情况: Enter a real number: 5656565
我是一名优秀的程序员,十分优秀!