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 - By absolute value, it means the function returns the positive value of an integer. The parameter or argument of function abs in C is an integral value.
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.

🌐
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.
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?

🌐
GNU
gnu.org › s › libc › manual › html_node › Absolute-Value.html
Absolute Value (The GNU C Library)
For a complex number z, whose real part is x and whose imaginary part is y, the absolute value is sqrt (x*x + y*y). Prototypes for abs, labs, llabs, uabs, ulabs and ullabs are in stdlib.h; imaxabs and uimaxabs are declared in inttypes.h; the fabs functions are declared in math.h; the cabs functions ...
🌐
C For Dummies
c-for-dummies.com › blog
Calculating the Absolute Value | C For Dummies Blog
Do not use any of these functions for your solution to this exercise! Instead, your challenge is to write a program that prompts the user for an integer (int) value and outputs its absolute value.
Find elsewhere
🌐
YouTube
youtube.com › watch
Absolute Value Functions abs() And fabs() | C Programming Tutorial - YouTube
How to find the absolute value of a number using the functions abs() and fabs() in C. Source code: https://github.com/portfoliocourses/c-example-code/blob/m...
Published   November 4, 2022
🌐
Tutorial Gateway
tutorialgateway.org › c-program-to-find-the-absolute-value-of-a-number
C Program to Find the Absolute Value of a Number
December 19, 2024 - This c example uses the labs function to find the absolute value of a long number. #include <stdio.h> #include <stdlib.h> int main() { long num; printf("Enter Number = "); scanf("%ld",&num); long abNum = labs(num); printf("\nActual = %ld", num); printf("\nAbsolute Number = %ld\n", abNum); }
🌐
Reddit
reddit.com › r/c_programming › write a function that computes the absolute value of an integer.
r/C_Programming on Reddit: Write a function that computes the absolute value of an integer.
July 6, 2022 -

Question: Write a function that computes the absolute value of an integer.

Prototype: int _abs(int); FYI: The standard library provides a similar function: abs. Run man abs to learn more.

My code: #include "main.h" #include "stdlib.h> int _abs(int n) { int abs (n); return (0); }

The protoype is in the main.h file and im trying to call the abs() function.

Compiler error:6-abs.c: In function ‘_abs’:
6-abs.c:11:2: error: parameter names (without types) in function declaration [-Werror]
11 | int abs(n);
| ~~
6-abs.c:9:14: error: unused parameter ‘n’ [-Werror=unused-parameter]
9 | int _abs(int n)
| ~~~~^
cc1: all warnings being treated as errors

I have no Idea what any of that means and i've tried to resolve it in different ways but more errors keep coming up. Can someone please explain what the problem to my code is?

🌐
LabEx
labex.io › tutorials › c-evaluate-absolute-value-expressions-in-c-435174
How to Evaluate Absolute Value Expressions in C | LabEx
In this lab, you will learn how to evaluate absolute value expressions in C programming. The lab covers the following steps: reading integer or float values, using the abs() or fabs() functions to compute the absolute value, and printing the result.
🌐
O'Reilly
oreilly.com › library › view › c-in-a › 0596006977 › re57.html
fabs - C in a Nutshell [Book]
December 16, 2005 - #include <math.h> doublefabs( double x ); float fabsf( float x ); long double fabsl( long double x ); The fabs() function returns the absolute value of its floating-point argument x; if x is greater than or equal to 0, the return value is equal to x.
Authors   Peter PrinzTony Crawford
Published   2005
Pages   618
🌐
Log2Base2
log2base2.com › c-examples › control › absolute-value-of-a-number-in-c.html
C program to find absolute value of a number
/* *program to find absolute value of a number *Language : C */ #include<stdio.h> int absolute(int n) { if(n < 0) // if number is negative, say -n return -n; // return -(-n) which is +n. return n; // Otherwise, return n.
🌐
Cplusplus
cplusplus.com › reference › cstdlib › abs
Cplusplus
The absolute value of n. In C, only the int version exists. For the long int equivalent see labs.
🌐
IBM
ibm.com › docs › en › rdfi › 9.6.0
ILE C/C++ Runtime Library Functions
We cannot provide a description for this page right now