【问题标题】:C integer to binary bit orderC整数到二进制位顺序
【发布时间】: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;
}

程序运行正常。我无法理解的是dgtssign 结构的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

标签: c struct binary


【解决方案1】:
  1. 位域中的位顺序是实现定义的,但大多数流行的编译器都以 LSB 开头。

  2. 数字以二进制形式存储,无论您如何输入它们。在大多数现代系统中,负数存储为 2'2 补码。在这个系统中,符号位“本身”不存在。不需要特殊类型

我会把它实现为

void printb(int n) {
    unsigned int mask = 1U << (sizeof(n) * CHAR_BIT - 1);

    for (; mask; mask >>= 1)
    {
        printf("%c", (n & mask) ? '1' : '0');
    }
}

【讨论】:

    猜你喜欢
    • 2021-12-28
    • 1970-01-01
    • 2020-12-11
    • 2017-08-22
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    相关资源
    最近更新 更多