进制转换函数 itoa() 详解

起因

昨晚深夜忽有一人问我一道题怎么写,是道进制转换的题,一开始我以为很简单,但这道题还是花了我一个小时的时间,而且大部分时间都花在了对于c语言itoa()函数的误解。
由该函数的参数列表可知(该函数的定义可以在stdlib.h文件中找到)

char *__cdecl itoa(int _Val,char *_DstBuf,int _Radix) __MINGW_ATTRIB_DEPRECATED_MSVC2005;

该函数可以把一个任意的十进制数转换为任意进制的字符串。而且经过debug我发现这个字符串的存储是从高位到低位。而这和下面题目要实现的目标不相符。因为55经过转换后会变成110111,而不是00000000000000000000000000110111 ,所以我们需要对这个字符串进行移位,使其从低地址到高地址排列。而这一部还是很好实现的,只需要写个循环。当一切准备就绪时,我以为我完成了,但没想到啊,-55的转换结果和目标大相径庭,于是我又debug了一次,发现了原因: itoa()函数最终是通过补码的形式存储结果。但我以为是用源码存储所以我错了,但知道了这个特性后我很快就写出来了正解,但由于我忘了IEEE754浮点数是啥,所以没写这部分。

题目描述

32位机器数,输入一个十进制数,转换为二进制数,显示其原码、反码、补码、移码及IEEE754浮点数。

input 1:

55

output 1:

原码:00000000000000000000000000110111
反码:00000000000000000000000000110111
补码:00000000000000000000000000110111
移码:10000000000000000000000000110111
IEEE754浮点数: 01000010010111000000000000000000

源码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(){
    int a,flag,tmp;
    scanf("%d",&flag);
    a=(int)abs(flag);
    char b[33],c[33],d[33],e[33],t[33];
    itoa(a,t,2);
    for(int i=0;i<33;i++){
        if(t[i]=='\0'){
            tmp=i;
            break;
        }
    }
    for(int i=0;i<33;i++){
        b[i]='0';
    }
    for(int i=tmp;i>=0;i--){
        b[32-tmp+i]=t[i];
    }
    if(flag>=0){
        for(int i=0;i<33;i++){
            c[i]=b[i];
            d[i]=b[i];
            e[i]=b[i];
        }
        e[0]='1';
    }else{
        itoa(flag,d,2);
        b[0]='1';
        for(int i=1;i<32;i++){
            if(b[i]=='0'){
                c[i]='1';
            }else{
                c[i]='0';
            }
        }
        c[0]='1';c[32]='\0';
        for(int i=1;i<32;i++){
            e[i]=d[i];
        }
        e[0]='0';e[32]='\0';
    }
    printf("%s\n%s\n%s\n%s",b,c,d,e);
    return 0;
    
}
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2022 舒窈
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信