Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将十进制数正确打印为二进制数时出现问题_C - Fatal编程技术网

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
的值。这是您所期望的吗?然后查找“有符号整数右移”.IIRC
1 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");
}