首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在数组中打印二进制数字?

如何在数组中打印二进制数字?
EN

Stack Overflow用户
提问于 2022-04-20 08:20:17
回答 3查看 285关注 0票数 2

我正在尝试用C语言打印二进制数字。二进制数从0开始有问题。当您尝试将其保存在数组中并试图打印它时,就会出现随机数,当您使用scanf输入时,该数字的前导零将消失。

在这种情况下我该怎么办?提前谢谢你的帮助。

代码语言:javascript
运行
复制
int main(){
    int binarys[3] ={01001001, 01100110, 00100000};
    size_t i;
    for(i=0; i<3; i++)
    {
        printf("%d\n", binarys[i]);
    }

    int binary;
    printf("Enter a binary: ");
    scanf("%d", &binary);
    printf("%d", binary); 
}

输出:

代码语言:javascript
运行
复制
262657
294984
32768
Enter a binary: 01001001
1001001
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-04-20 08:31:32

以0开头的二进制数有问题

整数常数开头的0不是二进制,而是八进制。

如果您有一个编译器,它将0b前缀作为扩展(或者来自将来的扩展),并且希望声明一个值为32的整数,无论出于什么原因,在基2中,编写0b00100000。但是,它的内容仍然与刚刚编写的32完全相同,因为基是数字的表示方式,不会影响其值。

当你得到扫描输入时,

scanf函数没有二进制转换说明符,而%d显式表示十进制,即基数为10。

如果你想扫描用二进制写的数字,你需要读取一个字符串,确认它只是1和0,并自己转换它(例如,使用strtol (比如strol(str, &end, 2)) )。

..。数字的前导零点消失。

默认情况下不打印前导零。

同样,printf没有二进制转换说明符,但是如果要打印前导零,则需要设置字段宽度并请求零填充,比如%08d

如果您想要以二进制格式打印数字,您也需要先将这些数字转换为字符串。

票数 2
EN

Stack Overflow用户

发布于 2022-04-20 08:31:21

整数字面值:

在C和C++中,以0开头的整数文字意味着它以八进制(基数8)表示。

因此,您初始化的int的数组包含的八进制值为1001001、1100110、100000,分别为262657、294984和32768。

二进制文本在C++中是可用的,因为C++ 14.c应该在C23中支持它(参见:常量)。

在此代码示例中:

代码语言:javascript
运行
复制
int main()
{
    int a = 010;
    printf("%d\n", a);

    int b = 0b10;
    printf("%d\n", b);
}

将打印以下内容(C++ 14):

代码语言:javascript
运行
复制
8
2

因为8是八进制10的十进制值,2是二进制10的十进制值。

scanf**:** 的问题

scanf将输入的值解析为十进制int (因为您指定了%d格式说明符)。它不应用语言文字规则。因此,没有数学意义的前导0会被忽略。您输入了01001001,它被解析为值为1001001的十进制int,这就是您在后面的printf中看到的(它再次使用%d格式说明符)。

票数 2
EN

Stack Overflow用户

发布于 2022-04-20 09:07:00

C不支持二进制整数常量,也不支持二进制文件/打印转换说明符。这是为即将推出的C标准"C23“而提出的。在此之前,0b前缀和%b转换说明符可能被一些编译器作为非标准扩展来支持(0b非常可能,%b不太可能)。

0开头的数字实际上是八进制整数常量。无论哪种方式,使用01001001打印/读取某些%d整数常量都是胡说八道。

使用当前的标准C,您可以使用一堆不可否认的丑陋宏来编写编译时转换:

代码语言:javascript
运行
复制
#include <stdio.h>

#define STATIC_ASSERT(expr) (int [expr]){0}

#define STR_TO_BIN(str) ( (str[0]-'0') * 128 + \
                          (str[1]-'0') *  64 + \
                          (str[2]-'0') *  32 + \
                          (str[3]-'0') *  16 + \
                          (str[4]-'0') *   8 + \
                          (str[5]-'0') *   4 + \
                          (str[6]-'0') *   2 + \
                          (str[7]-'0') *   1 )

#define BINARIFY(n) (STATIC_ASSERT(sizeof(#n)==9), STR_TO_BIN(#n))

int main(){
    int binaries[3] ={BINARIFY(01001001), BINARIFY(01100110), BINARIFY(00100000)};
    
    for(size_t i=0; i<3; i++)
    {
        printf("%d\n", binaries[i]);
    }
}

(“可怜人的静态断言”可以防止数组超出边界访问,而不是防止不正确的输入格式。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71936327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档