编译器报错:qsort函数对-2147483648、2147483648溢出报错

简介: 编译器报错:qsort函数对-2147483648、2147483648溢出报错

今天在刷leetcode,遇到一个测试案例没过,报错如下

runtime error: signed integer overflow: 1 - -2147483648 cannot be represented in type 'int' [solution.c]

int的范围明明是-2147483648 ~ 2147483647,我想破脑袋也没想到为什么会溢出?

又将代码搬到VS上运行试试,仍然是溢出,报错如下

error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型

经过网上翻阅帖子,终于在大佬的博客中找到了答案,原文链接如下C语言qsort()函数对-2147483648、2147483648溢出报错_char 47: runtime error: signed integer overflow: -_xx与oo的博客-CSDN博客

原因?

原因就是使用qsort函数时,其中的比较函数cmp,当e2为 -2147483648 时,再减去e1,结果返回就溢出了

int cmp(const void *e1,const void *e2)
{
    return *(int*)e2 - *(int*)e1;
}

如何解决?

将 - 改为 > 即可,这样就不会出现溢出的情况

int cmp(const void *e1,const void *e2)
{
    return *(int*)e2 > *(int*)e1;
}


目录
相关文章
|
2月前
|
C语言
C语言栈的括号匹配的检验讲解及相关代码
C语言栈的括号匹配的检验讲解及相关代码
37 0
|
8月前
|
存储 编译器 C语言
初始C语言——详细讲解操作符以及操作符的易错点
初始C语言——详细讲解操作符以及操作符的易错点
|
4月前
|
C语言
C语言中形参列表为指针的三种不同swap函数的通俗理解
C语言中形参列表为指针的三种不同swap函数的通俗理解
22 0
|
10月前
|
C语言
C语言:使用函数完成整型数组的打印、元素逆置、初始化
思路: 总体思路: (一). 实现 函数init() -- 初始化数组为全0 (二). 实现 函数print() -- 打印数组的每个元素 (三). 实现 函数reverse() -- 函数完成数组元素的逆置 (四). 完成 主函数 的编写 -- 测试这三个函数
168 0
|
6月前
|
C语言
【C语言】刨析数组作为函数参数时可能会出现的问题以及对应的解决方法
【C语言】刨析数组作为函数参数时可能会出现的问题以及对应的解决方法
35 0
|
10月前
|
C语言
C语言:计算n的阶乘(不考虑溢出)
题目: 从键盘输入一个值n,计算n的阶乘, 如:输入5,计算5的阶乘 --> 5! = 1 * 2 * 3 * 4 * 5
|
12月前
|
安全 编译器 C语言
VS编译器警告scanf未定义的三种解决办法
我们开始学习编程时候上手第一门语言通常是C语言,我们还需要下载一个编译器,最常见的莫过于Microsoft公司开发的Visual Studio(下面都简称VS)系列编译器,但是VS中我们使用scanf等函数时语句总是报错,显示不安全。
VS编译器警告scanf未定义的三种解决办法
|
安全 编译器 C语言
gets_s()函数的参数太少,strcpy_s():形参和实参 2 的类型不同,等c函数在Visual Studio上出现的问题, get()函数和scanf()读取字符串的区别,栈的随机性
gets_s()函数的参数太少,strcpy_s():形参和实参 2 的类型不同,等c函数在Visual Studio上出现的问题, get()函数和scanf()读取字符串的区别,栈的随机性
gets_s()函数的参数太少,strcpy_s():形参和实参 2 的类型不同,等c函数在Visual Studio上出现的问题, get()函数和scanf()读取字符串的区别,栈的随机性
解决办法:C代码中明明有,为什么编译时提示未定义的引用
解决办法:C代码中明明有,为什么编译时提示未定义的引用
235 0
|
程序员 编译器 C语言
C语言常见问题之数组越界与溢出
C语言常见问题之数组越界与溢出
358 0
C语言常见问题之数组越界与溢出