Deutsch   English   Français   Italiano  
<87tt7g7tqx.fsf@nosuchdomain.example.com>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!weretis.net!feeder9.news.weretis.net!news.quux.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail
From: Keith Thompson <Keith.S.Thompson+u@gmail.com>
Newsgroups: comp.lang.c
Subject: Re: The integral type 'byte' (was Re: Suggested method for returning a string from a C program?)
Date: Tue, 25 Mar 2025 13:14:30 -0700
Organization: None to speak of
Lines: 63
Message-ID: <87tt7g7tqx.fsf@nosuchdomain.example.com>
References: <vrd77d$3nvtf$2@dont-email.me> <868qp1ra5f.fsf@linuxsc.com>
	<vrdhok$47cb$2@dont-email.me> <20250319115550.0000676f@yahoo.com>
	<vreuj1$1asii$4@dont-email.me> <vreve4$19klp$2@dont-email.me>
	<20250319201903.00005452@yahoo.com> <86r02roqdq.fsf@linuxsc.com>
	<vrh1br$35029$2@dont-email.me> <LRUCP.2$541.0@fx47.iad>
	<vrh71t$3be42$1@dont-email.me> <vrh9vh$3ev9o$1@dont-email.me>
	<vrhct4$3frk8$2@dont-email.me> <20250320204642.0000423a@yahoo.com>
	<vrhphb$3s62l$1@dont-email.me>
	<87iko3s3h2.fsf@nosuchdomain.example.com>
	<vrrvgp$1828d$1@dont-email.me>
	<874izi82a4.fsf@nosuchdomain.example.com>
	<vrttin$321rm$1@dont-email.me> <20250325092315.416@kylheku.com>
	<vrusai$3rlfi$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain
Injection-Date: Tue, 25 Mar 2025 21:14:32 +0100 (CET)
Injection-Info: dont-email.me; posting-host="7cb379057f60c5676f5334e6c65b06bf";
	logging-data="89421"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX1+mT6lb6Mh4njzCHVxFnxhd"
User-Agent: Gnus/5.13 (Gnus v5.13)
Cancel-Lock: sha1:sMMcS673UyzOqSH2WmDahw2fOiw=
	sha1:LbOnGIcG78uYP6Pgyv5CDAJeK04=
Bytes: 4735

David Brown <david.brown@hesbynett.no> writes:
> On 25/03/2025 17:31, Kaz Kylheku wrote:
>> On 2025-03-25, David Brown <david.brown@hesbynett.no> wrote:
>>> Personally, I think "typedef uint8_t byte;" /is/ ideal - and much better
>>> than "typedef unsigned char byte;" would be.  I say that as someone who
>>> works in a field with bits and bytes more than ints and doubles.
>> The problem is that uint8_t is not endowed with the special
>> aliasing rules for accessing objects of other types as arrays
>> of unsigned char. A type called byte is prone to precipitating
>> into those uses.
>
> The minimum size for an "unsigned char" is 8 bits.  There are no other
> standard integer types that are unsigned, have no padding bits, and
> can be 8 bits in size (except that plain "char" can be identical to
> "unsigned char").  "uint8_t" is a typedef of an integer type that is
> exactly 8 bits, with no padding.  There can be no C implementation for
> which "uint8_t" can exist, and for which "unsigned char" is not an
> appropriate choice.  No other standard integer types can possibly be
> suitable (except perhaps "char").
>
> So if "uint8_t" on an implementation is /not/ a typedef for unsigned
> char, the implementation must be providing an extended integer type of
> identical size and characteristics to "unsigned char".  No known
> implementation of C has, to my knowledge, ever had actual extended
> integer types.
>
> In order for a C implementation to provide a uint8_t type that does
> not have the "magic" aliasing powers of character types (now called
> "byte types" in C23), the implementation would have to provide an
> extended integer type otherwise identical to "unsigned char" except
> for its aliasing powers, and specifically use that for "uint8_t"
> contrary to normal user expectations.  I believe this is
> hypothetically possible, but so unrealistic as to be ignorable.
> However, if you or anyone else has reason to believe it /is/
> realistic, I'd appreciate hearing about it.
>
>
>> A platform like Arduino could assert that in their toolchain,
>> the type byte does have those properties (and then somehow ensure
>> that is true, in spite of it being uint8_t, like by patching
>> the compiler if they have to).
>> 
>
> "uint8_t" is a typedef - not its own integer type.  If it is a typedef
> of "unsigned char" (as it is for the AVR gcc port, used by the
> Arduino), it inherits the magic aliasing powers of "unsigned char" -
> typedef names an alias, not a new type.

If it requires that long a line of reasoning to prove that uint8_t is
*very probably* an appropriate byte type, why not just use unsigned
char, which is guaranteed to be an appropriate byte type?

If you like, you can add:

    #if CHAR_BIT != 8
    #error "Nope"
    #endif

When I'm writing C, "byte" doesn't mean 8 bits.  It means CHAR_BIT bits.

-- 
Keith Thompson (The_Other_Keith) Keith.S.Thompson+u@gmail.com
void Void(void) { Void(); } /* The recursive call of the void */