C 将十进制数正确打印为二进制数时出现问题
我正在尝试编写代码来打印数字的二进制表示形式。这是我的尝试:C 将十进制数正确打印为二进制数时出现问题,c,C,我正在尝试编写代码来打印数字的二进制表示形式。这是我的尝试: #include <stdio.h> void getBinary(int num); int main(void) { int num = 2; getBinary(num); return 0; } void getBinary(int num) { int mask = 1 << 31, i; int temp; for (i = 31; i >=
#include <stdio.h>
void getBinary(int num);
int main(void) {
int num = 2;
getBinary(num);
return 0;
}
void getBinary(int num) {
int mask = 1 << 31, i;
int temp;
for (i = 31; i >= 0; i--) {
temp = num & mask;
if (temp > 0)
printf("1");
else
printf("0");
mask = mask >> 1;
}
printf("\n");
}
#包括
void getBinary(int num);
内部主(空){
int num=2;
getBinary(num);
返回0;
}
void getBinary(int num){
int mask=1=0;i--){
温度=数量和掩码;
如果(温度>0)
printf(“1”);
其他的
printf(“0”);
掩码=掩码>>1;
}
printf(“\n”);
}
这不管用。如果我使num=2,我的输出将是…0011。我得到的答案是:
void getBinary(int);
int main()
{
int num=0;
printf("Enter an integer number :");
scanf("%d",&num);
printf("\nBinary value of %d is =",num);
getBinary(num);
return 0;
}
/*Function definition : getBinary()*/
void getBinary(int n)
{
int loop;
/*loop=15 , for 16 bits value, 15th bit to 0th bit*/
for(loop=15; loop>=0; loop--)
{
if( (1 << loop) & n)
printf("1");
else
printf("0");
}
}
void-getBinary(int);
int main()
{
int num=0;
printf(“输入整数:”);
scanf(“%d”和&num);
printf(“\n%d的二元值为=”,num);
getBinary(num);
返回0;
}
/*函数定义:getBinary()*/
void getBinary(int n)
{
内环;
/*循环=15,对于16位值,第15位到第0位*/
对于(循环=15;循环>=0;循环--)
{
如果((1代码中存在一些问题:
- 如果
num<0
,则1 0
可能会错误失败,因为符号位也会使temp
为负值
- 将
mask
值为负值时向右移动会产生一个实现定义的结果:在您的平台上,它复制符号位,因此mask
将不会有预期的单个位,而是所有位都设置在当前位之上。这解释了观察到的行为
对于num
、temp
和mask
,应在函数getBinary
中使用类型unsigned int
,以获得正确的行为
以下是您的代码的更正版本:
#include <stdio.h>
void getBinary(unsigned int num);
int main(void) {
unsigned int num = 2;
getBinary(num);
return 0;
}
void getBinary(unsigned int num) {
unsigned int mask = 1U << 31;
unsigned int temp;
for (int i = 31; i >= 0; i--) {
temp = num & mask;
if (temp != 0)
printf("1");
else
printf("0");
mask = mask >> 1;
}
printf("\n");
}
初始化shift
至16
仅打印低位16位。\include
#include <stdio.h>
void getBinary(int num);
int main(void) {
unsigned int num = 2;
getBinary(num);
return 0;
}
void getBinary(int num) {
unsigned int mask = 1 << 31;
int i;
unsigned int temp;
for (i = 31; i >= 0; i--) {
temp = num & mask;
if (temp > 0)
printf("1");
else
printf("0");
mask = mask >> 1;
}
printf("\n");
}
void getBinary(int num);
内部主(空){
无符号整数num=2;
getBinary(num);
返回0;
}
void getBinary(int num){
无符号整数掩码=1=0;i--){
温度=数量和掩码;
如果(温度>0)
printf(“1”);
其他的
printf(“0”);
掩码=掩码>>1;
}
printf(“\n”);
}
对于那些好奇的人来说,这是正确的答案。只需将掩码设为无符号。提示:在循环的每次迭代中打印出mask
的值。这是您所期望的吗?然后查找“有符号整数右移”.IIRC1 1
可能并且通常会触发符号扩展,因为您的初始mask
值可能会被解释为负值。@GregHewgill我更改了我的定义,使mask不带符号,并且可以工作。感谢您的帮助!我意识到它们需要不带符号。谢谢您的帮助!1 FYI 6.5。10.3表示,如果对有符号和无符号操作数使用位and运算符,将执行“常规算术转换”。然后6.3.1.8要求将有符号类型转换为无符号类型。然后6.3.1.3.2要求按照“2的互补”约定进行这种转换。这意味着您的代码将打印出“2的互补”表示,不管实现实际做了什么。所以你要说的是,当数学运算完成时,如果整数被声明为无符号的话,它会被当作无符号的,但是如果我试图打印出来,它会像有符号一样打印出来。如果变量被声明为无符号的话,它为什么会这样做?@Nick:这是语言律师的观点您可能希望忽略的方面:符号+幅度中32位-1
的表示形式是1000000000000000000000000000000000001
,而在2s补码中是11111111111111111111
,在某人的补码中是11111111111111111111111110
。上面的代码将打印2s补码nt表示,即使在使用其他整数表示的非常罕见的机器上也是如此,而给出的答案将打印本机表示的低阶16位。
#include <stdio.h>
void getBinary(int num);
int main(void) {
unsigned int num = 2;
getBinary(num);
return 0;
}
void getBinary(int num) {
unsigned int mask = 1 << 31;
int i;
unsigned int temp;
for (i = 31; i >= 0; i--) {
temp = num & mask;
if (temp > 0)
printf("1");
else
printf("0");
mask = mask >> 1;
}
printf("\n");
}