abs(INT_MAX-(-1))

写一个程序,结果总是不对,check逻辑好几遍也没发现错误,无奈之下debug。发现一个有趣的现象abs(INT_MAX-(-1))返回值是-2147483648。于是看了下abs函数的代码实现。

1 int __cdecl abs (
2         int number
3         )
4 {
5         return( number>=0 ? number : -number );
6 }

这个问题设计无符号数、有符号数的范围,同时跟溢出之后的结果有关。abs函数的参数是int,是有符号的, INT_MAX-(-1)大于int的表示范围,其无符号值为2147483648,然后该无符号值转化为有符号int为-2147483648。对于语句number>=0? number:-number 我们得到-(-2147483648),即2147483648。而abs函数的返回值类型是int,是有符号的,2147483648转变为有符号int值为-2147483648。

abs(INT_MAX-(-1))

时间: 2024-08-28 15:25:07

abs(INT_MAX-(-1))的相关文章

[LeetCode] Divide Two Integers

In this problem, we are asked to divide two integers. However, we are not allowed to use division, multiplication and mod operations. So, what else can be use? Well, bit manipulations. Let's look at an example and see how bit manipulation might help.

那个你经常用的abs函数(取绝对值)真的总是返回非负数吗?

前几天在牛客网看到一道关于abs()函数返回值的题目,见下图,当时还没反应过来,第一反应是:自从我开始学C语言,就知道它是用来求int数的绝对值的,返回值当然是0或者正数啊,一看答案就是A. 后来思来想去,质问自己 难道这道题就这么简单?于是果断先查函数库,得到: #include <stdlib.h> //或math.h int abs( int num ); 发现库函数的返回值形式都写的是int,为什么是int?经过深入的思考.验证和查阅资料,最后得出: 当num为0或正数时,函数返回nu

Why define INT_MIN (-INT_MAX - 1)

C语言定义INT_MIN和INTMAX如下: #define INT_MAX     2147483647 #define INT_MIN      (-INT_MAX - 1) 为什么不直接定义INT_MIN为-2147483648呢? 如果你运行如下代码: if (-2147483648 > 0) printf("TRUE"); else printf("FALSE"); 你可能会发现令你意想不到的结果.这是为什么呢? 因为-2147483648不是一个数

模板:abs用法

c语言书本上说,数学函数除了求整数的绝对值函数abs()之外<abs() 定义在stdlib.h中>,其余的函数都在头文件 math.h 中定义,包括对浮点数求绝对值的函数fabs().c++中,包含的相应的头文件为,原则是前面加c,同时去掉.h .例如:#include <cstdlib>对应        #include <stdlib.h>#include <cmath>对应        #include <math.h> 于是,在c+

ZOJ 3789 Abs Problem

有时候像这种题,没有明显的思路,感觉像规律题.那么先暴力打表,再找规律就很快了. 题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3798 先上我的暴力打表,这种肯定是TLE的,只用它发现规律就好了. #include<cstdio> #include<cstring> #include<algorithm> #define INF 0x3f3f3f3f #define N 100 us

abs函数

原型: double abs (double x); float abs (float x); long double abs (long double x); double abs (T x); // additional overloads for integral types代码: // cmath's abs example #include <iostream> // std::cout #include <cmath> // std::abs int main () {

【BZOJ4127】Abs 树链剖分+线段树

[BZOJ4127]Abs Description 给定一棵树,设计数据结构支持以下操作 1 u v d 表示将路径 (u,v) 加d 2 u v 表示询问路径 (u,v) 上点权绝对值的和 Input 第一行两个整数n和m,表示结点个数和操作数 接下来一行n个整数a_i,表示点i的权值 接下来n-1行,每行两个整数u,v表示存在一条(u,v)的边 接下来m行,每行一个操作,输入格式见题目描述 Output 对于每个询问输出答案 Sample Input 4 4 -4 1 5 -2 1 2 2

ABS(x)

ABS(x) 用于返回 x 的绝对值 mysql> SELECT ABS(2), ABS(-2.3), ABS(-33); +--------+-----------+----------+ | ABS(2) | ABS(-2.3) | ABS(-33) | +--------+-----------+----------+ | 2 | 2.3 | 33 | +--------+-----------+----------+

什么是MBS,ABS和CDO

1. 都是资产证券化产品 华尔街有句名言“如果要增加未来的现金流,就把它做成证券.如果想经营风险,就把它做成证券”.从本质上来讲,MBS,ABS和 CDO都是资产证券化产品.根据美国证券交易委员会(SEC)给出的定义,资产证券化,指产生这样一种证券,它们主要是由一个特定的应收款资产池或其他金融资产池来支持(backed),保证偿付.而这些资产证券化产品的价值P可以用下面公式来表示:其中,n为资产池中应收账款或其他金融资产的偿还年限.不难看出,资产证券化产品的价值P受未来现金流量及市场利率r的影响

Python的内置方法,abs,all,any,basestring,bin,bool,bytearray,callable,chr,cmp,complex,divmod

Python的内置方法 abs(X):返回一个数的绝对值,X可以是一个整数,长整型,或者浮点数,如果X是一个复数,此方法返回此复数的绝对值(此复数与它的共轭复数的乘积的平方根) >>> abs(3+2j) 3.605551275463989 >>> abs(3-2j) 3.605551275463989 all(iterable):如果迭代器的所有元素都是true,或者空迭代器,则此方法返回true. any(iterable):迭代器只要有一个元素为false,或者空