【发布时间】:2021-01-27 13:48:48
【问题描述】:
下面的C程序显示输入十进制数的二进制表示:
#include <stdio.h>
#include <stdlib.h>
typedef union {
int i;
struct {
unsigned int dgts: 31;
unsigned int sign: 1;
} bin;
} myint;
void printb(int n, int i) {
int k;
for (k = i - 1; k >= 0; k--)
if ((n >> k) & 1)
printf("1");
else
printf("0");
}
void display_binary(myint x) {
printf("%d | ", x.bin.sign);
printb(x.bin.dgts, 31);
printf("\n");
}
int main() {
myint decimal;
printf("input decimal value : ");
scanf("%d", &decimal.i);
printf("Binary representation is:\n");
display_binary(decimal);
return 0;
}
程序运行正常。我无法理解的是dgts 和sign 结构的bin 成员的顺序。直观地说,sign 成员应该在 dgts 之前,因为代表数据的位从左到右写入内存(据我所知)。在交换这两个成员的命令后,结果变为错误。为什么dgts 应该在sign 之前?
【问题讨论】:
-
因为位使用是从位 0 向上分配的。
sign: 1成员是最后(顶部)位。 -
@WeatherVane 我认为十进制 1 在内存中表示为“000000000000000000000000000000001”(最左边的 0 指示加号)。所以你建议它实际上表示为“00000000000000000000000000000010”(最右边的0加号,其他数字)?
-
不,如果你有,说
unsigned int data: 4;将使用位 0、1、2 和 3。 -
"表示数据的位从左到右写入内存" 不。没有左或写入内存这回事。只有“低位地址”和“高位地址”。其他一切都是假设。对这些假设的分歧导致了严重的错误。在字节序方面没有“明显的”。在您看来越明显,您就越容易受到相应错误的影响。所以最好试着摆脱这个方向的所有想法。
-
@ElginCahangirov 负数的存储方式更“棘手”。 bbc.co.uk/bitesize/guides/zjfgjxs/revision/5