[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] byteswap: port better to limited platforms
From: |
Collin Funk |
Subject: |
Re: [PATCH] byteswap: port better to limited platforms |
Date: |
Fri, 17 May 2024 17:21:35 -0700 |
User-agent: |
Mozilla Thunderbird |
On 5/17/24 4:51 PM, Bruno Haible wrote:
> I think this produces wrong code with gcc 4.4.7 and older. See:
>
> -------------------------- foo.c --------------------------
> unsigned long long x = 0xff00000000000000;
> -----------------------------------------------------------
>
> $ gcc -Wall -S foo.c
> foo.c:1: warning: integer constant is too large for ‘long’ type
I think I've seen warnings like this before with newer GCC versions
but I am not sure if correct code was produced or not.
I have always disliked the need for suffixes after integer constants
in C (U, ULL, ULL, etc.).
If stdint correctly defines UINT16_C, UINT32_C, and UINT64_C then I
would just use those.
POSIX states [1]:
The macro INTN_C(value) shall expand to an integer constant
expression corresponding to the type int_least N _t. The macro
UINTN_C(value) shall expand to an integer constant expression
corresponding to the type uint_least N _t. For example, if
uint_least64_t is a name for the type unsigned long long, then
UINT64_C(0x123) might expand to the integer constant 0x123ULL.
I guess the regular U, UL, ULL suffix would work by themselves or a
cast if preferred.
Collin
[1] https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stdint.h.html