C언어/stdlib.h

[C언어] abs 함수 (정수의 절대값 구하기)

아무일도없었다 2023. 3. 29. 00:06

사용범위

Windows, Unix 등 모든 OS에서 사용가능한 표준 API 함수

기능

C언어 표준 함수로 입력받은 정수의 절대값을 계산하기 위해 사용한다.

헤더

#include <stdlib.h>

※ 함수 사용시 stdlib.h 파일을 include 하지 않는다면 컴파일 시 error 발생 ※


함수

int abs(int n);

파라미터

  • int n
    • 절대값을 구할 정수를 입력한다.

반환값

성공시   인자로 전달한 정수 n의 절대값을 반환한다.
    오류   반환값이 없다.

잡학지식

abs 함수는 전달 받은 정수 n의 절대값을 반환하는 함수이다.

 

하지만 int는 대부분의 환경에서 크기 4byte를 가지기에 표현할 수 있는 범위의 한계가 존재한다. (부호비트 포함)

 

int와 long은 무엇이 다를까?

 

[C언어] int 와 long 은 무엇이 다를까? (short, short int, int, long int, long, long long)

역사 컴퓨터는 지금의 32bit 64bit 가 아닌 8bit 16bit 가 주도했던 시절이 있었다. 당연하겠지만 64bit 가 아니라 32bit 도 처리할 수 없는 컴퓨터가 많았던 시절이었다. 당시에(아직까지도) CPU 시장을 주

hackerpark.tistory.com

 

따라서 int의 범위 INT_MIN(-2,147,483,648) ~ INT_MAX(2147483647) 범위에서 INT_MIN에 해당하는 INT_MIN(-2,147,483,648) 값은 부호비트로 인해 +2,147,483,648 표기를 할 수 없으므로 abs 함수를 호출해도 여전히 INT_MIN(-2,147,483,648) 값을 반환한다. (INT_MININT_MAX limits.h 헤더파일에 정의되어 있다.)

 


 

<소스 코드>

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int main() {
    int num1 = -12345;
    int num2 = 54321;
    int num3 = INT_MIN;

    long long num4 = -123456789000;
    
    printf("(-) num1[%d] absolute[%d]\n", num1, abs(num1));
    printf("(+) num2[%d] absolute[%d]\n", num2, abs(num2));
    printf("(INT_MIN) num3[%d] absolute[%d]\n", num3, abs(num3));

    printf("(overflow) num4[%lld] absolute[%d]\n", num4, abs(num4));

    return 0;
}

 

※ 실행 결과

(-) num1[-12345] absolute[12345]
(+) num2[54321] absolute[54321]
(INT_MIN) num3[-2147483648] absolute[-2147483648]
(overflow) num4[-123456789000] absolute[1097262584]

 

-123,456,789,000 값이 1,097,262,584 값으로 출력된 원인은 abs 함수에서 int의 4byte 영역만 계산을 하기 때문이다.

-123,456,789,000 값은 8byte의 hex값으로 보면 0xFFFF FFE3 4166 E5F8 이며 int 로 형변환을 하면 0x4166 E5F8 값만 남게 된다.

따라서 abs 함수를 통해 0x4166E5F8 값이 처리되어 1,097,262,584 라는 결과가 나오게 된다.

 

반응형