-------- Mensagem encaminhada --------

Assunto: Re: What is your opinion about unsigned int u = -2 ?

Data: Fri, 02 Aug 2024 19:29:27 -0700

De: Keith Thompson <Keith.S.Thompson+***@gmail.com>

Organização: None to speak of

Grupos de notícias: comp.lang.c

*Post by Thiago Adams**Post by Keith Thompson*[...]

*Post by Thiago Adams*It is interesting to compare constexpr with the existing constant

expression in C that works with integers.Compilers extend to work with

unsigned long long.

constexpr works with the sizes as defined , for instance char.

I'm not sure what you mean by "Compilers extend to work with

unsigned long long.".

enum {C = 18446744073709551615 -1 };

// ~~~~~~~~~~~~~~~~~~~~

// ^ warning: integer constant is so large that it is unsigned

https://godbolt.org/z/K7hzczETP

Since 18446744073709551615 is 2**64-1, it's outside the range of any

signed integer type in typical implementations. Since unsuffixed

integer constants are of some signed type (since C99), that constant is

likely to cause problems. You could write 18446744073709551615ull.

That's a rather odd warning. In C90, an unsuffixed integer constant's

type was the first of (int, long int, unsigned long int) in which its

value would fit. In C99 and later, an unsuffixed integer constant is of

type int, long int, or long long int, *never* of any unsigned type.

Since 18446744073709551615 exceeds ULLONG_MAX (assuming 64 bits),

apparently gcc treats it as having an unsigned type as an extension.

(My quick experiment indicates that, at least on my system,

18446744073709551615 is of type __int128 and, bizarrely,

18446744073709551616 is of type int with the value 0. This seems

like a bug.)

*Post by Thiago Adams*This part "shall only have operands that are integer constants"

From C23

"An integer constant expression132) shall have integer type and shall

only have operands that are

integer constants, named and compound literal constants of integer

type, character constants,

sizeof expressions whose results are integer constants, alignof

expressions, and floating, named,

or compound literal constants of arithmetic type that are the

immediate operands of casts. Cast

operators in an integer constant expression shall only convert

arithmetic types to integer types,

except as part of an operand to the typeof operators, sizeof operator,

or alignof operator."

I realized now I read "integer constants" as "int constants" that is

very diferent! Thanks for the explanation.

----

I checked and 18446744073709551615 is not unsigned long long

static_assert(TYPE_IS(18446744073709551615, unsigned long long));

https://godbolt.org/z/vnzWWxvjr

*Post by Thiago Adams*"In C99 and later, an unsuffixed integer constant is of

type int, long int, or long long int, *never* of any unsigned type."

I think this should be reviewed before they constexpr was added in C.

I am fixing my constant expression evaluation in cake and I will share

the code of "old" constant expressions and new constexpr. So constexpr

does not have restriction on signed types only.