The shortest solution in your first piece of code is to change the printf statement as follows:

    printf("absValue = %u\n", (unsigned)((u<0)?-u:u));

This will print the absolute value of u. The type conversion (unsigned) ensures that the data type is as expected by printf. The statement (u<0)?-u:u uses the conditional operator to select the value -u if the condition (u<0) is true and u if the condition is false (i.e. u>=0).

The problem in your code is that u is a signed integer which means its value is stored using the Two's complement representation in 4 bytes(*) and printf is not intelligent. When you tell printf to display an unsigned integer, then printf will take the 4 bytes holding u and interpret them as an unsigned integer. Since negative numbers in Two's complement are stored as large positive integers, that is the result you see.

(*) The use of Two's complement and the int size of 4 is machine-dependent, but common.

Answer from nielsen on Stack Overflow
๐ŸŒ
TutorialsPoint
tutorialspoint.com โ€บ c_standard_library โ€บ c_function_abs.htm
C library - abs() function
The C stdlib library abs() function is used to returns the absolute value of the specified number, where absolute represents the positive number. This function only returns the positive integer.
๐ŸŒ
Scaler
scaler.com โ€บ home โ€บ topics โ€บ abs() function in c
abs() Function in C - Scaler Topics
March 21, 2024 - In the C programming language, the use of the function abs in C is to return the absolute value of an integer. By integer, it means that the abs() is an arithmetics function.
Discussions

How to write absolute value in c - Stack Overflow
When you jam a signed value into an unsigned variable (or by printf trickery, try to interpret a signed value as if it were unsigned), the value you get is not the absolute value. Typically the value you get is the two's complement. Very different. ... BTW, there is an abs function that you ... More on stackoverflow.com
๐ŸŒ stackoverflow.com
microcontroller - Implementing an absolute value function in C - Electrical Engineering Stack Exchange
The standard C library is providing the optimized solutions for many problems with considerations based on the architecture, compiler in use and others. The abs() function defined in stdlib.h is one of these, and it is used for your purpose exactly. More on electronics.stackexchange.com
๐ŸŒ electronics.stackexchange.com
July 2, 2019
I recently switched from C to C++ and this code gives me this error "'abs' is missing exception specification 'throw()' " (in line 4).
Calling a function 'abs' in the root namespace is Undefined Behavior in C (inherited by C++!), as it is a standard library function. What you're seeing is part of the reason: 'abs' is a part of the standard library, and the standard library can implement it however it wants. See here: https://www.gnu.org/software/libc/manual/html_node/Reserved-Names.html More on reddit.com
๐ŸŒ r/cpp_questions
42
15
August 15, 2022
Fast abs function
Why do you think std::abs is too slow? The difference between +x and -x is not a flip of a single bit. Lookup "2's complement" And for integers, there is no -0 More on reddit.com
๐ŸŒ r/Cplusplus
34
5
March 5, 2024
๐ŸŒ
Fresh2Refresh
fresh2refresh.com โ€บ home โ€บ c programming tutorial โ€บ c โ€“ arithmetic functions โ€บ c โ€“ abs() function
C abs() function | C Arithmetic functions | Fresh2Refresh
September 23, 2020 - C abs() function:abs( ) function in C returns the absolute value of an integer. The absolute value of a number is always positive.
๐ŸŒ
Linux Hint
linuxhint.com โ€บ abs-function-c
abs function in C โ€“ Linux Hint
You may find yourself wanting positive ... โ€œAbsolute Valueโ€ inside the C programming language, and it specifies the distance of a number just on a number line beginning from 0 without taking the direction into account....
๐ŸŒ
Cppreference
en.cppreference.com โ€บ w โ€บ c โ€บ numeric โ€บ math โ€บ abs.html
abs, labs, llabs, imaxabs - cppreference.com
for 32-bit 2's complement type int, INT_MIN is -2147483648, but the would-be result 2147483648 is greater than INT_MAX, which is 2147483647. ... #include <limits.h> #include <stdio.h> #include <stdlib.h> int main(void) { printf("abs(+3) = %d\n", abs(+3)); printf("abs(-3) = %d\n", abs(-3)); // printf("%+d\n", abs(INT_MIN)); // undefined behavior on 2's complement systems }
๐ŸŒ
W3Schools
w3schools.com โ€บ c โ€บ ref_stdlib_abs.php
C stdlib abs() Function
C Examples C Real-Life Examples C Exercises C Quiz C Code Challenges C Compiler C Syllabus C Study Plan C Interview Q&A C Certificate ... The abs() function returns the absolute (positive) value of a number.
Find elsewhere
๐ŸŒ
Cplusplus
cplusplus.com โ€บ reference โ€บ cstdlib โ€บ abs
abs
Returns the absolute value of parameter n ( /n/ ). In C++, this function is also overloaded in header <cmath> for floating-point types (see cmath abs), in header <complex> for complex numbers (see complex abs), and in header <valarray> for valarrays (see valarray abs).
Top answer
1 of 5
4

The shortest solution in your first piece of code is to change the printf statement as follows:

    printf("absValue = %u\n", (unsigned)((u<0)?-u:u));

This will print the absolute value of u. The type conversion (unsigned) ensures that the data type is as expected by printf. The statement (u<0)?-u:u uses the conditional operator to select the value -u if the condition (u<0) is true and u if the condition is false (i.e. u>=0).

The problem in your code is that u is a signed integer which means its value is stored using the Two's complement representation in 4 bytes(*) and printf is not intelligent. When you tell printf to display an unsigned integer, then printf will take the 4 bytes holding u and interpret them as an unsigned integer. Since negative numbers in Two's complement are stored as large positive integers, that is the result you see.

(*) The use of Two's complement and the int size of 4 is machine-dependent, but common.

2 of 5
4

As an alternative, you can also use the standard C function abs() (or one of its related functions):

7.22.6.1 The abs, labs and llabs functions

Synopsis

     #include <stdlib.h>
     int abs(int j);
     long int labs(long int j);
     long long int llabs(long long int j);

Description

The abs, labs, and llabs functions compute the absolute value of an integer j. If the result cannot be represented, the behavior is undefined.

Returns

The abs, labs, and llabs, functions return the absolute value.

Footnotes

The absolute value of the most negative number cannot be represented in two's complement.

Note the footnote "The absolute value of the most negative number cannot be represented in two's complement." and "If the result cannot be represented, the behavior is undefined." Strictly speaking, you'd likely need to use long long int and llabs() to avoid undefined behavior in converting INT_MIN to a positive value, assuming a 32-bit int value, and long is often 32-bits, even on 64-bit Windows.

However, since double values are likely implemented in IEEE format with 53 bits of precision, a 32-bit int value can be converted to double with no loss of precision, so you can use the fabs() function to get the absolute value of a 32-bit int value in one call:

7.12.7.2 The fabs functions

Synopsis

    #include <math.h>
    double fabs(double x);
    float fabsf(float x);
    long double fabsl(long double x);

The fabs functions compute the absolute value of a floating-point number x.

So your code would be:

#include <stdio.h>
#include <math.h>

int main (int argc, char *argv[]) {
    int u;

    scanf("%d", &u);
    printf("absValue = %u\n", (unsigned) fabs((double) u));

    return 0;
}

Note that in (unsigned) fabs((double) u), casting u to double is not strictly necessary, as the int value will be implicitly converted to a double because of the double fabs(double) function prototype from stdlib.h. But the cast back to unsigned is exremely necessary to pass the unsigned int value you want to pass to printf().

You could also do this:

#include <stdio.h>
#include <math.h>

int main (int argc, char *argv[]) {
    int u;

    scanf("%d", &u);
    unsigned int absValue = fabs(u);
    printf("absValue = %u\n", absValue);

    return 0;
}

That works because unsigned int absValue is explicitly an unsigned int.

Also, on modern CPUs, conversion between int and double is usually done by a single relatively fast instruction.

๐ŸŒ
Quora
quora.com โ€บ What-is-the-function-of-the-ABS-function-in-C-programming-language
What is the function of the ABS() function in C programming language? - Quora
Answer (1 of 2): My initial inclination was to write that it exercised your abdominal muscles, making them strong enough to lift the manual containing descriptions of all the functions in the standard C library, but I realised that it might be a bit harsh. abs(x) returns the positive magnitude o...
๐ŸŒ
C For Dummies
c-for-dummies.com โ€บ blog
The abs() Function | C For Dummies Blog
November 12, 2016 - The following code uses the abs() function to return the positive (absolute) difference between values in a loop that runs from -10 and steps up to +10:
๐ŸŒ
GeeksforGeeks
geeksforgeeks.org โ€บ c++ โ€บ abs-labs-llabs-functions-cc
abs(), labs(), llabs() functions in C/C++ - GeeksforGeeks
July 11, 2025 - The std::abs() in C++ is used to find the absolute value of given number. The value returned by std::abs() function is of type int.
Top answer
1 of 3
11

The standard C library is providing the optimized solutions for many problems with considerations based on the architecture, compiler in use and others. The abs() function defined in stdlib.h is one of these, and it is used for your purpose exactly. To emphasize the point, here is ARM compiler result when using abs vs a version of a homebrew abs: https://arm.godbolt.org/z/aO7t1n

Paste:

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

int main(void)
{
    srand(111);
    int x = rand() - 200;
    printf("%d\n", abs(x));
}

results in

main:
        push    {r4, lr}
        mov     r0, #111
        bl      srand
        bl      rand
        sub     r1, r0, #200
        cmp     r1, #0
        rsblt   r1, r1, #0
        ldr     r0, .L4
        bl      printf
        mov     r0, #0
        pop     {r4, pc}
.L4:
        .word   .LC0
.LC0:
        .ascii  "%d\012\000"

And

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

int my_abs(int x)
{
    return x < 0 ? -x : x;
}

int main(void)
{
    srand(111);
    int x = rand() - 200;
    printf("%d\n", my_abs(x));
}

results in

my_abs:
        cmp     r0, #0
        rsblt   r0, r0, #0
        bx      lr
main:
        push    {r4, lr}
        mov     r0, #111
        bl      srand
        bl      rand
        sub     r1, r0, #200
        cmp     r1, #0
        rsblt   r1, r1, #0
        ldr     r0, .L5
        bl      printf
        mov     r0, #0
        pop     {r4, pc}
.L5:
        .word   .LC0
.LC0:
        .ascii  "%d\012\000"

Notice that the main code is identical (only a label name is different) in both programs as my_abs got inlined, and its implementation is the same as the standard one.

2 of 3
3

The speed of a given solution will depend greatly on the architecture, but in C I would say

return (n > 0 ? n : -n);

and let the compiler figure out the best solution.

EDIT: @jonk points out correctly that this will fail for the most-negative possible value of n, assuming that two's-complement arithmetic is used.

Yes, my solution has a conditional branch, but yours has an arithmetic operator and two bitwise operators. Can your microcontroller shift 15 places in a single clock?

๐ŸŒ
Programming Simplified
programmingsimplified.com โ€บ c โ€บ math.h โ€บ abs
abs in C | Programming Simplified
printf("Enter an integer to calculate its absolute value\n"); scanf("%d", &n); result = abs(n); printf("Absolute value of %d = %d\n", n, result); return 0; } Output of program: You can implement you own function as follows: long absolute(long value) { if (value < 0) return -value; return value; ...
๐ŸŒ
Tutorial Gateway
tutorialgateway.org โ€บ c-abs-function
C abs function
March 25, 2025 - The C abs function is one of the mathematical functions that is used to return the absolute positive value of a given negative number.
๐ŸŒ
W3Resource
w3resource.com โ€บ c-programming โ€บ stdlib โ€บ c-abs.php
C abs() function
December 16, 2005 - C abs() function (stdlib.h): The abs() function is used to compute the absolute value of an integer value.
๐ŸŒ
Oreate AI
oreateai.com โ€บ blog โ€บ a-detailed-explanation-of-the-cc-abs-function-from-principles-to-practical-applications โ€บ 98179184802234d17e6a4a7370fbad68
A Detailed Explanation of the C/C++ Abs Function: From Principles to Practical Applications - Oreate AI Blog
January 7, 2026 - The absolute value function abs ... The core functionality of this function is to return the absolute value of any integer, which represents its distance from zero on a number line....
๐ŸŒ
Runebook.dev
runebook.dev โ€บ en โ€บ docs โ€บ c โ€บ numeric โ€บ math โ€บ abs
Mastering the abs function in C: Common Pitfalls and Safer Alternatives
The abs function calculates the absolute value of an integer. The absolute value of a number is its distance from zero on the number line
๐ŸŒ
Cprogramming.com
cprogramming.com โ€บ fod โ€บ abs.html
abs - C/C++ Function Reference - Cprogramming.com
How to begin Get the book ยท C tutorial C++ tutorial Game programming Graphics programming Algorithms More tutorials