Deutsch   English   Français   Italiano  
<v6oo01$2fja8$1@dont-email.me>

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

Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: bart <bc@freeuk.com>
Newsgroups: comp.lang.c
Subject: =?UTF-8?Q?Re=3A_technology_discussion_=E2=86=92_does_the_world_need?=
 =?UTF-8?B?IGEgIm5ldyIgQyA/?=
Date: Thu, 11 Jul 2024 14:50:58 +0100
Organization: A noiseless patient Spider
Lines: 84
Message-ID: <v6oo01$2fja8$1@dont-email.me>
References: <v66eci$2qeee$1@dont-email.me> <v67gt1$2vq6a$2@dont-email.me>
 <v687h2$36i6p$1@dont-email.me> <v68sjv$3a7lb$1@dont-email.me>
 <v6a76q$3gqkm$6@dont-email.me> <87plrruvmt.fsf@nosuchdomain.example.com>
 <v6argi$3ngh6$5@dont-email.me> <v6crb5$1gpa$1@dont-email.me>
 <v6kma1$1jcln$7@dont-email.me> <v6lcg3$1qhmn$1@dont-email.me>
 <v6nhbr$29e0c$3@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Thu, 11 Jul 2024 15:50:57 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="92757c0b3eb137c08e71ba54311788f0";
	logging-data="2608456"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX181gkDXOOLQLHsJ4W6w8wZ6"
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:3F/Tzccwki2sizP1/6NCXcLhZWY=
In-Reply-To: <v6nhbr$29e0c$3@dont-email.me>
Content-Language: en-GB
Bytes: 4517

On 11/07/2024 03:51, Lawrence D'Oliveiro wrote:
> On Wed, 10 Jul 2024 03:16:18 -0400, James Kuyper wrote:
> 
>> On 7/9/24 20:57, Lawrence D'Oliveiro wrote:
>>
>>> On Sat, 6 Jul 2024 21:34:29 -0400, James Kuyper wrote:
>>>
>>>> On many platforms, if _Alignof(type) is less than the word size, then
>>>> a C pointer to that type is implemented as the combination of the
>>>> machine address of the correct word, combined with an offset within
>>>> that word of the first byte of that object.
>>>
>>> Which is a terrific idea, except it cannot be carried to its logical
>>> conclusion (addressing of arbitrarily-aligned dynamically-defined
>>> bitfields) because of the requirement in the C spec that the size of a
>>> “byte” be at least 8 bits.
>>
>> I will grant you that I failed to mention the fact that this is a
>> feasible way of implementing C only on platforms with a word size of 16
>> bits or longer.
> 
> Don’t you think C needs a better way of handling bitfields than shift-and-
> mask?

Yes. But because it's not hard for a million programmers to each create 
their own macros like GETBIT and SETBIT, that's not going to happen.

Although bit operations are unusual in other languages too.


> Many architectures have bitfield instructions, but C cannot easily
> make use of them without the ability to have arbitrarily-bit-aligned
> pointers.

When you look in depth at working with bits and bitfields, it is a 
surprisingly wide area with lots of possibilities

* Define named bits and bitfields within a struct (C already has this, 
although with little control). These bitfields are fixed length and 
location known at compile-time (although only to the compiler!), and can 
be of size 1 to 64 bits

* Extract a bit/bitfield from an integer value. These can have a 
position and length only known at runtime.

* Inject such a bit/bitfield into an integer value

* Allow bitfields that can straddle a word boundary.

* Allow small arrays of bitfields of width 1, 2 or 4 bits that fit 
within an integer. (8-bit bitfields are just bytes.)

* Allow full arrays of such bitfields, and slices of such arrays

* Allow arrays of bitfields of any width 1..64 bits

* Allow pointers to a bitfield of a certain fixed width 1..64 bits

* Allow that pointer to to stepped either to the next bitfield, or by 
any arbitrary number of bits

* Allow a bit-pointer with a variable target bit-width

* Allow bitwise ops between arrays of bits

* ....

----------------------

For my static language, I have:

* Bitfields within structs with more control than C, and are defined 
inside a regular integer field.

* Bit indexing to extract or inject bits/bitfields: A.[i] and A.[i..j]

My dynamic language also has arbitrary arrays of 1/2/4 bits, bit-slices, 
and bit-pointers to fields of 1..64 bits. It also has bit-sets of any 
size on which bitwise ops can be used.

At the level of C, I believe that bit-arrays are a possibility, without 
also needing to have bit-pointers that are bit-aligned. Pointers to the 
start of such arrays are fine, as they will be byte-aligned.