我在这里不提出很多问题,所以如果我的“提问技巧”有些生疏,请原谅。以下是我的问题:
我已经查找了一些资料,但似乎找不到解决方案。
这个程序的想法是打印出一个表格,其中包含具有任意位数的数字的每个可能值的十进制(有符号和无符号)、十六进制和二进制表示。它从argv接受位大小,示例输出应该是(重点关注二进制表示):
$ ./test 2
00
01
10
11
$ ./test 4
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
这段代码使用预处理宏可以正常工作,但这意味着我每次想要改变位数时都需要重新编译。如果使用argv,所有问题都能解决,但有一个小问题。编译器似乎不喜欢我的做法,即使这看起来非常合理。
int bit_size = atoi(argv[1]);
struct { unsigned int a : bit_size; } test;
但编译器给我一个错误,严厉地告诉我我不能这样做(“位域不是整数常量”)。
好的...所以我尝试使用 const int
代替:
const int bit_size = atoi(argv[1]);
struct { unsigned int a : bit_size; } test;
我遇到了完全相同的错误。
需要注意的是,GCC希望我执行以下操作:
struct { unsigned int a : 8; } test;
而且它可以正常运作。但我需要能够变化。
我很困惑。
请注意,我不希望或需要位域的宽度在程序中间改变,这就是我认为GCC试图防止我做的事情。这实际上是一次性操作。
还要注意,我并不像这个问题(以及许多类似的问题)那样在普通变量上尝试这样做。
这个问题也与我想要完成的任务无关。
此外,如果有帮助的话,这是一个在没有错误的情况下运行时显示的示例(位域宽度=4):
$ ./test 4
$ cat table.md
Table for a/an 4-bit integer:
| Unsigned | Signed | Hex | Binary | Sign Bit |
|:--------:|:------:|:---:|:------:|:--------:|
| 0 | 0 | 0 | 0000 | 0 |
| 1 | 1 | 1 | 0001 | 0 |
| 2 | 2 | 2 | 0010 | 0 |
| 3 | 3 | 3 | 0011 | 0 |
| 4 | 4 | 4 | 0100 | 0 |
| 5 | 5 | 5 | 0101 | 0 |
| 6 | 6 | 6 | 0110 | 0 |
| 7 | 7 | 7 | 0111 | 0 |
| 8 | -8 | 8 | 1000 | 1 |
| 9 | -7 | 9 | 1001 | 1 |
| 10 | -6 | A | 1010 | 1 |
| 11 | -5 | B | 1011 | 1 |
| 12 | -4 | C | 1100 | 1 |
| 13 | -3 | D | 1101 | 1 |
| 14 | -2 | E | 1110 | 1 |
| 15 | -1 | F | 1111 | 1 |