我正在尝试用C语言打印二进制数字。二进制数从0开始有问题。当您尝试将其保存在数组中并试图打印它时,就会出现随机数,当您使用scanf输入时,该数字的前导零将消失。
在这种情况下我该怎么办?提前谢谢你的帮助。
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);
}
输出:
262657
294984
32768
Enter a binary: 01001001
1001001
发布于 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
。
如果您想要以二进制格式打印数字,您也需要先将这些数字转换为字符串。
发布于 2022-04-20 08:31:21
整数字面值:
在C和C++中,以0
开头的整数文字意味着它以八进制(基数8)表示。
因此,您初始化的int
的数组包含的八进制值为1001001、1100110、100000,分别为262657、294984和32768。
二进制文本在C++中是可用的,因为C++ 14.c应该在C23中支持它(参见:常量)。
在此代码示例中:
int main()
{
int a = 010;
printf("%d\n", a);
int b = 0b10;
printf("%d\n", b);
}
将打印以下内容(C++ 14):
8
2
因为8是八进制10
的十进制值,2是二进制10
的十进制值。
scanf
**:** 的问题
scanf
将输入的值解析为十进制int
(因为您指定了%d
格式说明符)。它不应用语言文字规则。因此,没有数学意义的前导0会被忽略。您输入了01001001
,它被解析为值为1001001的十进制int
,这就是您在后面的printf
中看到的(它再次使用%d
格式说明符)。
发布于 2022-04-20 09:07:00
C不支持二进制整数常量,也不支持二进制文件/打印转换说明符。这是为即将推出的C标准"C23“而提出的。在此之前,0b
前缀和%b
转换说明符可能被一些编译器作为非标准扩展来支持(0b
非常可能,%b
不太可能)。
以0
开头的数字实际上是八进制整数常量。无论哪种方式,使用01001001
打印/读取某些%d
整数常量都是胡说八道。
使用当前的标准C,您可以使用一堆不可否认的丑陋宏来编写编译时转换:
#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]);
}
}
(“可怜人的静态断言”可以防止数组超出边界访问,而不是防止不正确的输入格式。)
https://stackoverflow.com/questions/71936327
复制相似问题