Request Short Link
C++ 98
C++ 11
C++ 14
C++ 17
C++ 20
C++ 23
C++ 2c
for-loops as while-loops
array subscription
Show all implicit casts
Show all template parameters of a CallExpr
Use libc++
Transform std::initializer_list
Show noexcept internals
Show padding information
Show coroutine transformation
Show C++ to C transformation
Show object lifetime
Default
15
18
20
22
26
More
GitHub
Patreon
Issues
About
Policies
Examples
C++ Insights @ YouTube
Settings
Version
Workshop: Safe and Efficient C++ for Embedded Environments
×
Made by
Andreas Fertig
Powered by
Flask
and
CodeMirror
Source:
///usr/bin/env ccache gcc -Wall -Wextra -Werror -O3 -std=gnu17 "$0" -o /tmp/a -lm && /tmp/a "$@"; exit // For the line just above, see my answer here: https://stackoverflow.com/a/75491834/4561887 #include <limits.h> #include <stdbool.h> // For `true` (`1`) and `false` (`0`) macros in C #include <stdint.h> // For `uint8_t`, `int8_t`, etc. #include <stdio.h> // For `printf()` #define TEST_EQ(func, num1, num2, equals) \ printf("%s\n", func((num1), (num2)) == (equals) ? "Passed" : "FAILED") /// Safely and efficiently return `abs((int8_t)num1 - (int8_t)num2)` uint8_t abs_num1_minus_num2_int8(int8_t num1, int8_t num2) { // Note: due to implicit type promotion rules, rule 3 in my answer here // (https://stackoverflow.com/a/72654668/4561887) applies, and the `>` comparison, as well as // subtraction, takes place below as `int` types. While signed `int` overflow and underflow is // undefined behavior, none of that occurs here. It's just useful to understand that even // though we are doing `(uint8_t)num1 - (uint8_t)num2`, the compiler really sees it as this: // `(int)(uint8_t)num1 - (int)(uint8_t)num2`. uint8_t abs_diff = num1 > num2 ? (uint8_t)num1 - (uint8_t)num2 : (uint8_t)num2 - (uint8_t)num1; // debugging printf("num1 = %4i (%3u); num2 = %4i (%3u); num1-num2=%3u; ", num1, (uint8_t)num1, num2, (uint8_t)num2, abs_diff); return abs_diff; } /// Safely and efficiently return `abs((int)num1 - (int)num2)` unsigned int abs_num1_minus_num2_int(int num1, int num2) { unsigned int abs_diff = num1 > num2 ? (unsigned int)num1 - (unsigned int)num2 : (unsigned int)num2 - (unsigned int)num1; // debugging printf("num1 = %11i (%10u); num2 = %11i (%10u); num1-num2=%10u; ", num1, (unsigned int)num1, num2, (unsigned int)num2, abs_diff); return abs_diff; } int main() { printf("Absolute difference tests.\n"); // --------------- // int8_t types // --------------- int8_t num1_8; int8_t num2_8; printf("\n"); printf("INT8_MIN = %i, INT8_MAX = %i\n", INT8_MIN, INT8_MAX); // -128, 127 num1_8 = -7; num2_8 = -4; TEST_EQ(abs_num1_minus_num2_int8, num1_8, num2_8, 3); num1_8 = INT8_MIN; num2_8 = INT8_MAX; TEST_EQ(abs_num1_minus_num2_int8, num1_8, num2_8, UINT8_MAX); num1_8 = INT8_MAX; num2_8 = INT8_MIN; TEST_EQ(abs_num1_minus_num2_int8, num1_8, num2_8, UINT8_MAX); num1_8 = 100; num2_8 = 10; TEST_EQ(abs_num1_minus_num2_int8, num1_8, num2_8, 90); num1_8 = 10; num2_8 = 100; TEST_EQ(abs_num1_minus_num2_int8, num1_8, num2_8, 90); num1_8 = 10; num2_8 = 10; TEST_EQ(abs_num1_minus_num2_int8, num1_8, num2_8, 0); num1_8 = INT8_MAX; num2_8 = 1; TEST_EQ(abs_num1_minus_num2_int8, num1_8, num2_8, 126); num1_8 = 1; num2_8 = INT8_MAX; TEST_EQ(abs_num1_minus_num2_int8, num1_8, num2_8, 126); // --------------- // int types // --------------- int num1; int num2; printf("\n"); printf("INT_MIN = %i, INT_MAX = %i\n", INT_MIN, INT_MAX); // -2147483648, 2147483647 num1 = -7; num2 = -4; TEST_EQ(abs_num1_minus_num2_int, num1, num2, 3); num1 = INT_MIN; num2 = INT_MAX; TEST_EQ(abs_num1_minus_num2_int, num1, num2, UINT_MAX); num1 = INT_MAX; num2 = INT_MIN; TEST_EQ(abs_num1_minus_num2_int, num1, num2, UINT_MAX); num1 = 100; num2 = 10; TEST_EQ(abs_num1_minus_num2_int, num1, num2, 90); num1 = 10; num2 = 100; TEST_EQ(abs_num1_minus_num2_int, num1, num2, 90); num1 = 10; num2 = 10; TEST_EQ(abs_num1_minus_num2_int, num1, num2, 0); num1 = INT_MAX; num2 = 1; TEST_EQ(abs_num1_minus_num2_int, num1, num2, 2147483646); num1 = 1; num2 = INT_MAX; TEST_EQ(abs_num1_minus_num2_int, num1, num2, 2147483646); return 0; }
Insight:
Console: