Reduced bit number in short

P

Philipp

Hello
I'm working on a piece of code which I did not write and it has
variables defined as:

unsigned short i:13;
unsigned short j:13;
unsigned short k:3;

As I understand the code, this means that i is reduced to being coded on
13 bits (same for j) and k is reduced to 3 bits.
1) Is my understanding right?
2) Is there any documentation on this ":" operator somewhere (I could
not find anything by searching the web)

Thank you for your answers Phil
 
R

Ron Natalie

Philipp said:
Hello
I'm working on a piece of code which I did not write and it has
variables defined as:

unsigned short i:13;
unsigned short j:13;
unsigned short k:3;

As I understand the code, this means that i is reduced to being coded on
13 bits (same for j) and k is reduced to 3 bits.
1) Is my understanding right?
2) Is there any documentation on this ":" operator somewhere (I could
not find anything by searching the web)

Look up "bitfield" (or perhaps "bit field") in your C text.

: here isn't an operator, it's part of the declaration syntax. Bitfields are a bit funky.
It is used to carve up an integral type into smaller pieces. The packing of the bits
into the larger type is extremely machine dependent.
 
J

Jacek Dziedzic

Ron said:
Look up "bitfield" (or perhaps "bit field") in your C text.

: here isn't an operator, it's part of the declaration syntax. Bitfields are a bit funky.
It is used to carve up an integral type into smaller pieces. The packing of the bits
into the larger type is extremely machine dependent.

Whoa, what are these? I've never seen a thing like that before! :).
Is this Standard C++, or C perhaps? Or a relic of some sorts like
the auto keyword? My compiler gives a "declaration syntax error" for:

// ---
int main() {
unsigned short k:13;
}
// ---

Can anybody shed some light on this?

TIA,
- J.
 
O

Old Wolf

Actually you need to look up "bit-field", if searching the Standard
Whoa, what are these? I've never seen a thing like that before! :).
Is this Standard C++, or C perhaps? Or a relic of some sorts like
the auto keyword? My compiler gives a "declaration syntax error" for:

// ---
int main() {
unsigned short k:13;
}

They've been in C for decades but are not widely used. They are only
valid within structs or unions, which is why your code is an error.
Also, bit-fields must be _Bool, int, unsigned int, or signed int,
although it's a common extension to allow "unsigned short" etc.

In the original example, if unsigned short has at least 29 bits,
then there will only be 1 actual unsigned short in the struct,
and "i", "j" and "k" will be packed into it, and whenever you use
i,j,k in expressions, the compiler automatically twiddles the bits.
Otherwise they would be packed into 2 unsigned shorts.

Probably why they are unpopular is that you can't do 'sizeof' on them
and you can't take their address (hence, you can't pass pointers to
them to a function, for example), and the packing method is
implementation-defined. I don't think anyone would really mind if
they were deprecated.
 
J

Jack Klein

Whoa, what are these? I've never seen a thing like that before! :).
Is this Standard C++, or C perhaps? Or a relic of some sorts like
the auto keyword? My compiler gives a "declaration syntax error" for:

// ---
int main() {
unsigned short k:13;
}
// ---

Can anybody shed some light on this?

Bit-fields have been part of C for about 30 years now, before the
publication of the first edition of K&R. They have been part of C++
since its beginning.

But they cannot be used as stand-along objects, only as members of
structs and (in C++ only, of course) classes.

Any decent book on C or C++ should cover them.
 
J

Jacek Dziedzic

Jack said:
Bit-fields have been part of C for about 30 years now, before the
publication of the first edition of K&R. They have been part of C++
since its beginning.

But they cannot be used as stand-along objects, only as members of
structs and (in C++ only, of course) classes.

Any decent book on C or C++ should cover them.

Thanks a lot to both of you!

- J.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,007
Latest member
obedient dusk

Latest Threads

Top