C语言进制转换

C语言进制转换,第1张

计算机中常用的数的进制主要有:二进制、八进制、十进制、十六进制。  

2进制,用两个阿拉伯数字:0、1;  

8进制,用八个阿拉伯数字:0、1、2、3、4、5、6、7;  

10进制,用十个阿拉伯数字:0到9;  

16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这五个字母来分别表示10,11,12,13,14,15。字母不区分大小写。 

下面用余数短除法把十进制数转化为二进制数为例进行说明

1、明确问题。举个例子,我们现在是要将一个十进制数字156转换成二进制数字。先将这个十进制数作为被除数写在一个倒着的“长除法”的符号里。把目标数系的基数(在这里二进制是“2”)作为除数写在这个除法符号的外面。用这个方法将计算过程可视化会更方便理解,因为整个计算过程只需将数字一直除以2。

2、进行除法运算。把结果的整数部分(商数)写在长除法符号的下面,然后把它的余数(0 或 1)写在被除数的右边。

我们现在是以2为除数,因此得出的商为偶数,则余数为0;如果得出商为奇数,则余数记为1。

3、一直往下继续除,直到商为0为止。把每一个新的商数除以二,然后把余数写在被除数的右边。直到商数为0为止。

4、写出新的二进制数字。从最下面的余数开始,按顺序读到最上面。本例中,你会得到10011100。这就是十进制数字156的二进制形式。或者,我们可以以脚注等式的形式表达,即:15610 = 100111002

活用这个方法可以将所有十进制数字转换成任何进制表达。除数为2是因为我们最终想得到的以2为基数的数(即二进制数值) 。如果最终想得到其他数系的数字,用目标数系的基数代替这个方法里二进制的基数2 就可以了。例如,要得到基数为9的数,就用9来代替2作为除数 。最终的结果就是目标数系的数字表达。

扩展资料:

十进制--->二进制

对于整数部分,用被除数反复除以2,除第一次外,每次除以2均取前一次商的整数部分作被除数并依次记下每次的余数。另外,所得到的商的最后一位余数是所求二进制数的最高位。

对于小数部分,采用连续乘以基数2,并依次取出的整数部分,直至结果的小数部分为0为止。故该法称“乘基取整法”

十进制--->八进制

10进制数转换成8进制的方法,和转换为2进制的方法类似,唯一变化:除数由2变成8。

参考资料:百度百科——进制转换

十进制转化为十六进制代码:

#include "stdio.h" int main()

{

int num=0

int a[100]

int i=0

int m=0

int yushu

char hex[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}

printf("请输入一个十进制数:")

scanf("%d",&num) while(num>0) { yushu=num%16

a[i++]=yushu

num=num/16

} printf("转化为十六进制的数为:0x") for(i=i-1i>=0i--)//倒序输出 {m=a[i]

printf("%c",hex[m]) } printf("\n")

}

程序运行结果:

扩展资料:

进制转换由一组数码符号和两个基本因素“基数”与“位权”构成。基数是指,进位计数制中所采用的数码(数制中用来表示“量”的符号)的个数。位权是指,进位制中每一固定位置对应的单位值。

举例:二进制数转换为十进制数

二进制数第0位的权值是2的0次方,第1位的权值是2的1次方……

所以,设有一个二进制数:0110 0100,转换为10进制为:

下面是竖式:

0110 0100 换算成十进制

第0位 0 * 20 = 0

第1位 0 * 21 = 0

第2位 1 * 22 = 4

第3位 0 * 23 = 0

第4位 0 * 24 = 0

第5位 1 * 25 = 32

第6位 1 * 26 = 64

第7位 0 * 27 = 0

公式:第N位2(N)

---------------------------

100

用横式计算为:

0 * 20 + 0 * 21 + 1 * 22 + 0 * 23 + 0 * 24 + 1 * 25 + 1* 26 + 0 * 27 = 100

0乘以多少都是0,所以我们也可以直接跳过值为0的位:

1 * 22 + 1 * 25 +1*26 = 100

参考资料:

百度百科-进制转换

#include <stdio.h>

#include <stdbool.h>  //true, false

#include <malloc.h>

#include <stdlib.h>   //atoi() 字符串转整数

#include <ctype.h>   //isalpha(), isdigit()

#include <string.h>

#include <math.h>

/// 输入字符串数字,字符串长度,该数字是几进制数

/// 返回一个十进制数

int StrToInt(char* str, size_t len, size_t base)

{

  bool isnegtive = false //该数是否表示负数

  int i = 0 

  if (str[0] == '-')  

  {

    i++ 

    isnegtive = true

  }

  int num = 0  // 最后计算出的10进制数

  for ( i < len ++i)

  {

    char tem = toupper(str[i]) //若为字母,转换成大写字母,其余不变

    int index = 0

    if (isalpha(tem)) // 若是字母,转化成对应的10进制数

      index = tem - 'A' + 10

    else if(isdigit(tem))

      index = tem - '0'

    else { /* do nothing*/ }

    num += index * (int)pow(base, len - 1 - i)

  }

  return isnegtive ? -num : num

}

/// 把10进制数转换成 指定进制的数

void ToBaseNumber(int orig, size_t base)

{

  if (orig == 0)

  {

    printf("%d\n", 0)

    return

  }

  if (orig < 0) 

  {

    putchar('-')

    orig = -orig // 变成正数

  }

  int* arr = (int* )malloc(sizeof(int) * 16), len = 0, i

  while (orig > 0)

  {

    arr[len++] = orig % base

    orig /= base

  }

  for (i = len - 1 i >= 0 --i)

  {

    printf("%d", arr[i])

  }

  putchar('\n')

  return

}

int main(int argc, char const *argv[])

{

  int T

  scanf("%d", &T)

  while (T--)

  {

    char* chs = (char* )malloc(sizeof(char) * 16)

    int n, m

    scanf("%s %d %d", chs, &n, &m)

    int orig = StrToInt(chs, strnlen(chs, 11), n)

    ToBaseNumber(orig, m)

  }

  return 0

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7888926.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存