test_bitfields.c

来自「用于进行gcc测试」· C语言 代码 · 共 163 行

C
163
字号
/* This is a small test to see if bitfields are working.  It is only a   few structs and a union and a test to see if they have the correct   size, if values can be read and written and a couple of argument   passing tests.  No alignment testing is done.  */#include "defines.h"#include "macros.h"/* These five bitfields are taken from the System V ABI, Intel 386   architecture supplement.  *//* Word aligned, sizeof is 4.  */struct RightToLeft{  int j:5;  int k:6;  int m:7;};/* Word aligned, sizeof is 12.  */struct BoundaryAlignment{  short s:9;  int   j:9;  char  c;  short t:9;  short u:9;  char  d;};/* Halfword aligned, sizeof is 2.  */struct StorageUnitSharing{  char  c;  short s:8;};/* Halfword aligned, sizeof is 2.  */union Allocation{  char  c;  short s:8;};/* Byte aligned, sizeof is 9.  */struct Unnamed{  char  c;  int    :0;  char  d;  short  :9;  char  e;  char   :0;};/* Extra struct testing bitfields in larger types.   Doubleword aligned, sizeof is 8.  */struct LargerTypes{  long long l:33;  int       i:31;};voidpassing1 (struct RightToLeft str, int j, int k, int m){  assert (str.j == j);  assert (str.k == k);  assert (str.m == m);}voidpassing2 (struct BoundaryAlignment str, short s, int j, char c, short t,	  short u, char d){  assert (str.s == s);  assert (str.j == j);  assert (str.c == c);  assert (str.t == t);  assert (str.u == u);  assert (str.d == d);}voidpassing3 (struct StorageUnitSharing str, char c, short s){  assert (str.c == c);  assert (str.s == s);}voidpassing4 (struct Unnamed str, char c, char d, char e){  assert (str.c == c);  assert (str.d == d);  assert (str.e == e);}voidpassing5 (struct LargerTypes str, long long l, int i){  assert (str.l == l);  assert (str.i == i);}voidpassingU (union Allocation u, char c){  assert (u.c == c);  assert (u.s == c);}intmain (void){  struct RightToLeft str1;  struct BoundaryAlignment str2;  struct StorageUnitSharing str3;  struct Unnamed str4;  struct LargerTypes str5;  union Allocation u;  /* Check sizeof's.  */  check_size(str1, 4);  check_size(str2, 12);  check_size(str3, 2);  check_size(str4, 9);  check_size(str5, 8);  check_size(u, 2);  /* Check alignof's.  */  check_align_lv(str1, 4);  check_align_lv(str2, 4);  check_align_lv(str3, 2);  check_align_lv(str4, 1);  check_align_lv(str5, 8);  check_align_lv(u, 2);  /* Check passing.  */  str1.j = str2.s = str3.c = str4.c = str5.l = 4;  str1.k = str2.j = str3.s = str4.d = str5.i = 5;  str1.m = str2.c = str4.e = 6;  str2.t = 7;  str2.u = 8;  str2.d = 9;  passing1 (str1, 4, 5, 6);  passing2 (str2, 4, 5, 6, 7, 8, 9);  passing3 (str3, 4, 5);  passing4 (str4, 4, 5, 6);  passing5 (str5, 4, 5);  u.c = 5;  passingU (u, 5);  u.s = 6;  passingU (u, 6);  return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?