- Code: Select all
`max Least representable value in the reduction list item type`

min Largest representable value in the reduction list item type

How should the terms "least representable value" and "largest representable value" be interpreted when it comes to the C _Bool data type (and C++ bool, for that matter)? The final C11 draft (N1570) states the following on p. 51:

When any scalar value is converted to _Bool, the result is 0 if the value compares equal

to 0; otherwise, the result is 1.

Based on this, I think it would be least surprising for the programmer if the "least representable value" for _Bool is 0, and the "largest representable value" is 1, despite the underlying representation taking at least a byte of storage. There doesn't seem to be a consensus among several compilers I've checked; e.g., consider the following program:

- Code: Select all
`#include <stdio.h>`

int main(void) {

_Bool min_val = 1, max_val = 0;

#pragma omp parallel reduction(min:min_val) reduction(max:max_val) \

num_threads(1)

{

printf("min_val: %i\n", min_val);

printf("max_val: %i\n", max_val);

}

}

Output using compiler A:

- Code: Select all
`min_val: 1`

max_val: 0

Output using compiler B:

- Code: Select all
`min_val: 255`

max_val: 0

Output using compiler C:

- Code: Select all
`min_val: 127`

max_val: -128