Skip to content

Commit 55cff64

Browse files
committed
Add snippet
1 parent 8349d95 commit 55cff64

File tree

2 files changed

+44
-8
lines changed

2 files changed

+44
-8
lines changed

README.md

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
# c_bitfields_integer_promotion
2-
Little experiment to check how integer promotion affects bitfields
32

4-
The interest in this came after the discussion at https://lore.kernel.org/all/[email protected]/t/#u
3+
Little experiment to check how integer promotion affects bitfields.
4+
5+
The interest in this came after the discussion at <https://lore.kernel.org/all/[email protected]/t/#u>
6+
7+
Turns out that for bitfields bigger than `sizeof(int)` the behavior is compiler dependent.
58

69
## A bunch of related links
710

8-
https://gcc.gnu.org/onlinedocs/gcc/Structures-unions-enumerations-and-bit-fields-implementation.html
11+
<https://gcc.gnu.org/onlinedocs/gcc/Structures-unions-enumerations-and-bit-fields-implementation.html>
912

10-
https://stackoverflow.com/questions/2647320/struct-bitfield-max-size-c99-c
13+
<https://stackoverflow.com/questions/2647320/struct-bitfield-max-size-c99-c>
1114

12-
https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#Bit-Fields
15+
<https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#Bit-Fields>
1316

14-
https://archive.org/details/the-ansi-c-programming-language-by-brian-w.-kernighan-dennis-m.-ritchie.org/page/132/mode/2up
17+
<https://archive.org/details/the-ansi-c-programming-language-by-brian-w.-kernighan-dennis-m.-ritchie.org/page/132/mode/2up>
1518

16-
https://stackoverflow.com/questions/32529080/should-bit-fields-less-than-int-in-size-be-the-subject-of-integral-promotion
19+
<https://stackoverflow.com/questions/32529080/should-bit-fields-less-than-int-in-size-be-the-subject-of-integral-promotion>
1720

18-
https://stackoverflow.com/questions/46073295/implicit-type-promotion-rules
21+
<https://stackoverflow.com/questions/46073295/implicit-type-promotion-rules>

main.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#include <stdio.h>
2+
3+
struct s1{
4+
unsigned int a: 20;
5+
unsigned int _: 12;
6+
};
7+
8+
struct s2 {
9+
unsigned long long b: 40;
10+
unsigned long long _: 24;
11+
};
12+
13+
int main()
14+
{
15+
struct s1 s1;
16+
struct s2 s2;
17+
18+
s1.a = 2;
19+
s2.b = 2;
20+
21+
unsigned int a = s1.a << 19;
22+
unsigned long long b = s2.b << 39;
23+
24+
printf("0x%x\n", a); //both gcc and clang: 0x100000
25+
printf("0x%llx\n", b); //gcc: 0x0 clang: 0x10000000000
26+
27+
return 0;
28+
}
29+
30+
/*
31+
Debian clang version 18.1.8
32+
gcc (Debian 12.2.0-14) 12.2.0
33+
*/

0 commit comments

Comments
 (0)