C语言中的进制转换

基础概念

进制又称数制,是指用一组固定的符号和统一的规则来表示数值的方法,在C语言中,可以使用不同的前缀来表示不同的进制:

  • 二进制:以0b或0B为前缀(部分编译器可能不支持)
  • 八进制:以0为前缀
  • 十进制:无特殊前缀
  • 十六进制:以0x或0X为前缀

进制转换方法大约分为3种:

  • 二进制、八进制、十六进制转十进制:
    按照各进制的权值展开,然后相加即可得到十进制数。
  • 十进制转二进制、八进制、十六进制:
    采用除基取余法,即用十进制数除以目标进制的基数,然后取整数部分继续除,直到商为0为止,最后将所有余数从后往前排列,即可得到转换后的数。
  • 二进制、八进制、十六进制之间的转换:
    可以先转换为十进制,然后再转换为目标进制,也可以利用它们之间的关系直接转换,如二进制与八进制之间可以每三位二进制数对应一位八进制数进行转换。

在C语言代码编写中,可以使用标准库函数如printf和scanf来进行进制的输入和输出,比如使用%d格式符输出十进制数,%x或%X输出十六进制数(小写或大写),%o输出八进制数。对于二进制的输入和输出,C语言标准库并未提供直接的支持,但可以通过位运算等技巧实现。

进制位二进制八进制十进制十六进制
规则逢二进一逢八进一逢十进一逢十六进一
基数r=2r=8r=10r=16
数符0,10,1,2,3,…70,1,2,3,…90,1,2,3,…15
2 i 2^{i} 2i 8 i 8^{i} 8i 1 0 i 10^{i} 10i 1 6 i 16^{i} 16i
形式表示符BODH

常用的进制转换表:

二进制八进制十进制十六进制
0000000x0
0001110x1
0010220x2
0011330x3
0100440x4
0101550x5
0110660x6
0111770x7
10001080x8
10011190x9
101012100xA
101113110xB
110014120xC
110115130xD
111016140xE
111117150xF

二进制转换

二进制转换为八进制
#include <stdio.h>  
#include <string.h>  
#include <math.h>  void binaryToOctal(char *binary) {  int len = strlen(binary);  int extraZeros = len % 3; // 计算需要补充的0的个数,让他能被3整除  char octal[len / 3 + extraZeros + 1]; // 分配足够的空间来存储八进制数  int octalIndex = 0;  int binaryIndex = 0;  // 如果二进制数长度不是3的倍数,则前面补0  for (int i = 0; i < extraZeros; i++) {  printf("0");  }  while (binaryIndex < len) {  int value = 0;  for (int i = 0; i < 3 && binaryIndex < len; i++, binaryIndex++) {  value = value * 2 + (binary[binaryIndex] - '0');  }  octal[octalIndex++] = (value < 8) ? (value + '0') : '?'; // ?表示转换错误  }  octal[octalIndex] = '\0'; // 添加字符串结束符  printf("%s\n", octal);  
}  int main() {  char binary[] = "1101001"; // 示例binaryToOctal(binary); // 调用函数进行转换  return 0;  
}

在这里插入图片描述

二进制转换为十进制

使用到了pow()函数,需要添加 -lm 选项来链接libm数学库

gcc test.c -o test -lm
./test
// test.c
#include <stdio.h>  
#include <string.h>  
#include <math.h>  void binaryToOctal(char *binary) {  int len = strlen(binary);  int extraZeros = len % 3; char octal[len / 3 + extraZeros + 1]; int octalIndex = 0;  int binaryIndex = 0;  for (int i = 0; i < extraZeros; i++) {  printf("0");  }  while (binaryIndex < len) {  int value = 0;  for (int i = 0; i < 3 && binaryIndex < len; i++, binaryIndex++) {  value = value * 2 + (binary[binaryIndex] - '0');  }  octal[octalIndex++] = (value < 8) ? (value + '0') : '?'; }  octal[octalIndex] = '\0'; printf("%s\n", octal);  
}  int main() {  char binary[] = "1101001"; binaryToOctal(binary); return 0;  
}

在这里插入图片描述

二进制转换为十六进制
#include <stdio.h>  
#include <string.h>  
#include <math.h>  void binaryToHexadecimal(char *binary) {  int length = strlen(binary);  int decimal = 0;  for (int i = length - 1; i >= 0; i--) {  if (binary[i] == '1') {  decimal += pow(2, length - 1 - i);  }  }  if (decimal < 16) {  if (decimal >= 10) {  printf("%c", decimal - 10 + 'A');  } else {  printf("%d", decimal);  }  } else {  binaryToHexadecimal(binary); int remainder = decimal % 16;  if (remainder >= 10) {  printf("%c", remainder - 10 + 'A');  } else {  printf("%d", remainder);  }  }  
}  int main() {  char binary[65]; printf("Enter a binary number: ");  scanf("%32s", binary);  printf("Hexadecimal representation: ");  binaryToHexadecimal(binary);  printf("\n");  return 0;  
}  

在这里插入图片描述

十进制转换

十进制转换为二进制
#include <stdio.h>  void decimalToBinary(int n) {  if (n == 0) {  return;  }  decimalToBinary(n / 2);  printf("%d", n % 2);  
}  int main() {  int decimal;  printf("Enter a decimal number: ");  scanf("%d", &decimal);  printf("Binary representation: ");  decimalToBinary(decimal);  printf("\n");  return 0;  
}

在这里插入图片描述

十进制转换为八进制
#include <stdio.h>  void decimalToOctal(int n) {  if (n < 8) {  printf("%d", n);  return;  }  decimalToOctal(n / 8);  printf("%d", n % 8);  
}  int main() {  int decimal;  printf("Enter a decimal number: ");  scanf("%d", &decimal);  printf("Octal representation: ");  decimalToOctal(decimal);  printf("\n");  return 0;  
}

在这里插入图片描述

十进制转换为十六进制
#include <stdio.h>  void decimalToHexadecimal(int n) {  if (n < 16) {  if (n >= 10) {  printf("%c", n - 10 + 'A');  } else {  printf("%d", n);  }  return;  }  decimalToHexadecimal(n / 16);  decimalToHexadecimal(n % 16);  
}  int main() {  int decimal;  printf("Enter a decimal number: ");  scanf("%d", &decimal);  printf("Hexadecimal representation: ");  decimalToHexadecimal(decimal);  printf("\n");  return 0;  
}

在这里插入图片描述

八进制转换

八进制转换为二进制
#include <stdio.h>  
#include <string.h>  void octalToBinary(char *octal) {  int length = strlen(octal);  for (int i = 0; i < length; i++) {  int digit = octal[i] - '0';  switch (digit) {  case 7: printf("111"); break;  case 6: printf("110"); break;  case 5: printf("101"); break;  case 4: printf("100"); break;  case 3: printf("011"); break;  case 2: printf("010"); break;  case 1: printf("001"); break;  case 0: printf("000"); break;  }  }  
}  int main() {  char octal[33];printf("Enter an octal number: ");  scanf("%32s", octal);  printf("Binary representation: ");  octalToBinary(octal);  printf("\n");  return 0;  
}

在这里插入图片描述

八进制转换为十进制
#include <stdio.h>  
#include <string.h>  
#include <math.h>  long long octalToDecimal(char *octal) {  int length = strlen(octal);  long long decimal = 0;  for (int i = 0; i < length; i++) {  int digit = octal[i] - '0';  decimal += digit * pow(8, length - 1 - i);  }  return decimal;  
}  int main() {  char octal[33]; printf("Enter an octal number: ");  scanf("%32s", octal);  long long decimal = octalToDecimal(octal);  printf("Decimal representation: %lld\n", decimal);  return 0;  
}

在这里插入图片描述

八进制转换为十六进制
#include <stdio.h>  
#include <string.h>  
#include <math.h>  long long octalToDecimal(char *octal) {  int length = strlen(octal);  long long decimal = 0;  for (int i = 0; i < length; i++) {  int digit = octal[i] - '0';  decimal += digit * pow(8, length - 1 - i);  }  return decimal;    
}  void decimalToHexadecimal(long long decimal) {    if (decimal < 16) {    if (decimal >= 10) {     printf("%c", (int)(decimal - 10 + 'A'));    } else {    printf("%lld", decimal);    }    } else {    decimalToHexadecimal(decimal / 16);    decimalToHexadecimal(decimal % 16);    }    
}
int main() {  char octal[33]; printf("Enter an octal number: ");  scanf("%32s", octal);  long long decimal = octalToDecimal(octal);  printf("Hexadecimal representation: ");  decimalToHexadecimal(decimal);  printf("\n");  return 0;  
}

在这里插入图片描述

十六进制转换

十六进制转换为二进制
#include <stdio.h>  
#include <string.h>  
#include <ctype.h>  void hexadecimalToBinary(char hex) {  switch (toupper(hex)) {  case '0': printf("0000"); break;  case '1': printf("0001"); break;  case '2': printf("0010"); break;  case '3': printf("0011"); break;  case '4': printf("0100"); break;  case '5': printf("0101"); break;  case '6': printf("0110"); break;  case '7': printf("0111"); break;  case '8': printf("1000"); break;  case '9': printf("1001"); break;  case 'A': case 'a': printf("1010"); break;  case 'B': case 'b': printf("1011"); break;  case 'C': case 'c': printf("1100"); break;  case 'D': case 'd': printf("1101"); break;  case 'E': case 'e': printf("1110"); break;  case 'F': case 'f': printf("1111"); break;  default: printf("Invalid hexadecimal digit\n"); break;  }  
}  int main() {  char hexadecimal[100];  printf("Enter a hexadecimal number: ");  scanf("%s", hexadecimal);  printf("Binary representation: ");  for (int i = 0; hexadecimal[i] != '\0'; i++) {  hexadecimalToBinary(hexadecimal[i]);  }  printf("\n");  return 0;  
}

在这里插入图片描述

十六进制转换为八进制
#include <stdio.h>  
#include <string.h>  
#include <ctype.h>  int hexadecimalToOctalDigit(char hex) {  switch (toupper(hex)) {  case '0': return 0;  case '1': return 1;  case '2': return 2;  case '3': return 3;  case '4': return 4;  case '5': return 5;  case '6': return 6;  case '7': return 7;  case '8': return 10; case '9': return 11;case 'A': case 'a': return 12;case 'B': case 'b': return 13;case 'C': case 'c': return 14; case 'D': case 'd': return 15; case 'E': case 'e': return 16; case 'F': case 'f': return 17; default: return -1; }  
}  void hexadecimalToOctal(const char *hexadecimal) {  int length = strlen(hexadecimal);  int value = 0;  int base = 1;  for (int i = length - 1; i >= 0; --i) {  int digit = hexadecimalToOctalDigit(hexadecimal[i]);  if (digit == -1) {  printf("Invalid hexadecimal input\n");  return;  }  value += digit * base;  base = base == 1 ? 8 : base * 16;  if (base == 128) { printf("%o", value); value = 0; base = 1; }  }  if (value > 0) { printf("%o", value);  }  
}  int main() {  char hexadecimal[100];  printf("Enter a hexadecimal number: ");  scanf("%s", hexadecimal);  printf("Octal representation: ");  hexadecimalToOctal(hexadecimal);  printf("\n");  return 0;  
}

在这里插入图片描述

十六进制转换为十进制
#include <stdio.h>  
#include <string.h>  
#include <math.h>  
#include <ctype.h>  long long hexadecimalToDecimal(const char *hexadecimal) {  long long decimal = 0;  int length = strlen(hexadecimal);  for (int i = length - 1, power = 0; i >= 0; --i, ++power) {  int digit = 0;  char c = toupper(hexadecimal[i]);  if (c >= '0' && c <= '9') {  digit = c - '0';  } else if (c >= 'A' && c <= 'F') {  digit = 10 + (c - 'A');  } else {  printf("Invalid hexadecimal input\n");  return -1;  }  decimal += digit * pow(16, power);  }  return decimal;  
}  int main() {  char hexadecimal[100];  printf("Enter a hexadecimal number: ");  scanf("%s", hexadecimal);  long long decimal = hexadecimalToDecimal(hexadecimal);  if (decimal != -1) {  printf("Decimal representation: %lld\n", decimal);  }  return 0;  
}

在这里插入图片描述

字符转换

#include <stdio.h>  
#include <string.h>  
#include <math.h>  
#include <ctype.h>  // 十进制
int charToDecimal(char c) {  return (int)c;  
}
// 二进制
void charToBinary(char c, char *binary) {  int decimal = (int)c;  int index = 0;  while (decimal > 0) {  binary[index++] = (decimal % 2) + '0';  decimal /= 2;  }  binary[index] = '\0'; for (int i = 0; i < index / 2; i++) {  char temp = binary[i];  binary[i] = binary[index - i - 1];  binary[index - i - 1] = temp;  }  
}
// 八进制
void charToOctal(char c, char *octal) {  int decimal = (int)c;  int index = 0;  while (decimal > 0) {  octal[index++] = (decimal % 8) + '0';  decimal /= 8;  }  octal[index] = '\0'; for (int i = 0; i < index / 2; i++) {  char temp = octal[i];  octal[i] = octal[index - i - 1];  octal[index - i - 1] = temp;  }  
}
// 十六进制
void charToHexadecimal(char c, char *hexadecimal) {  int decimal = (int)c;  int index = 0;  while (decimal > 0) {  int digit = decimal % 16;  if (digit < 10) {  hexadecimal[index++] = digit + '0';  } else {  hexadecimal[index++] = (digit - 10) + 'A';  }  decimal /= 16;  }  hexadecimal[index] = '\0'; for (int i = 0; i < index / 2; i++) {  char temp = hexadecimal[i];  hexadecimal[i] = hexadecimal[index - i - 1];  hexadecimal[index - i - 1] = temp;  }  
}int main() {  char inputChar;  printf("Enter a character: ");  scanf(" %c", &inputChar); // c前有一个空格,可以跳过任何空白字符  int decimal = charToDecimal(inputChar);  printf("Decimal(十进制): %d\n", decimal);  char binary[33]; // 32位表示一个字符的ASCII码的二进制形式  charToBinary(inputChar, binary);  printf("Binary(二进制): %s\n", binary);  char octal[12]; // 最多需要11位来表示一个字符的ASCII码的八进制形式  charToOctal(inputChar, octal);  printf("Octal(八进制): %s\n", octal);  char hexadecimal[9]; // 最多需要8位来表示一个字符的ASCII码的十六进制形式  charToHexadecimal(inputChar, hexadecimal);  printf("Hexadecimal(十六进制): %s\n", hexadecimal);  return 0;  
}

在这里插入图片描述

十六进制在内存操作上的应用

这里给分配一段动态内存,并使用十六进制值初始化这块内存区域,然后打印出内存中的内容

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  int main() {  // 动态分配一个包含16个字节的内存块  unsigned char *memoryBlock = (unsigned char *)malloc(16 * sizeof(unsigned char));  if (memoryBlock == NULL) {  printf("Memory allocation failed.\n");  return 1;  }  // 使用十六进制值初始化内存块  unsigned char initValues[] = {0xA1, 0xB2, 0xC3, 0xD4, 0xE5, 0xF6, 0x07, 0x18,  0x29, 0x3A, 0x4B, 0x5C, 0x6D, 0x7E, 0x8F, 0x90};  // 将初始化值复制到分配的内存块中  memcpy(memoryBlock, initValues, 16 * sizeof(unsigned char));  // 打印内存块中的内容,以十六进制形式展示  printf("Memory contents (in hexadecimal):\n");  for (int i = 0; i < 16; ++i) {  printf("%02X ", memoryBlock[i]);  if ((i + 1) % 8 == 0) {  printf("\n");  }  }  printf("\n");  free(memoryBlock);  return 0;  
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/32731.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【论文精读】分类扩散模型:重振密度比估计(Revitalizing Density Ratio Estimation)

文章目录 一、文章概览&#xff08;一&#xff09;问题的提出&#xff08;二&#xff09;文章工作 二、理论背景&#xff08;一&#xff09;密度比估计DRE&#xff08;二&#xff09;去噪扩散模型 三、方法&#xff08;一&#xff09;推导分类和去噪之间的关系&#xff08;二&a…

LVGL8.3动画图像(太空人)

LVGL8.3 动画图像 1. 动画图像本质 我们知道电影属于视频&#xff0c;而电影的本质是将一系列动作的静态图像进行快速切换而呈现出动画的形式&#xff0c;也就是说动画本质是一系列照片。所以 lvgl 依照这样的思想而定义了动画图像&#xff0c;所以在 lvgl 中动画图像类似于普…

能理解你的意图的自动化采集工具——AI和爬虫相结合

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三连支…

浅聊Cookie

前言 在客户端使用Nuxt的useFetch调用接口并存储cookie&#xff0c;发现一些趣事~ cookie存储需要遵守同源策略~ 理论我们是知道的&#xff0c;但具体是怎么一回事呢~ 实现 在Nuxt中是这样的~ 直接访问 Nuxt <template><div>{{ data }}</div> </te…

【python】python学生成绩数据分析可视化(源码+数据+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

c#使用自带库对字符串进行AES加密、解密

文章目录 1 代码1.1 定义Aes加密类块1.2 在主函数中调用 2 获取Key和IV2.1 基本方法2.2 自定义Key2.3 技术方面的原理 参考文章&#xff1a; C#软件加密实例&#xff1f; 。 参考官文&#xff1a; Aes 类。 在使用C#的自带的System.Security.Cryptography.Aes模块进行加密和解…

Spdlog日志库的安装配置与源码解析(Linux)

为什么使用日志库而不是控制台输出&#xff1f; 日志库通常提供了更丰富的功能&#xff0c;比如可以设置日志输出级别、输出到不同的目标&#xff08;比如控制台、文件、网络等&#xff09;&#xff0c;以及格式化输出等。 使用日志库可以使代码更易于维护。通过统一的日志接口…

Opencv学习项目2——pytesseract

上一次我们使用pytesseract.image_to_boxes来检测字符&#xff0c;今天我们使用pytesseract.image_to_data来检测文本并显示 实战教程 和上一次一样&#xff0c;添加opencv-python和pytesseract库 首先我们先来了解一下pytesseract.image_to_data pytesseract.image_to_data(…

红队内网攻防渗透:内网渗透之内网对抗:横向移动篇入口切换SMB共享WMI管道DCOM组件Impacket套件CS插件

红队内网攻防渗透 1. 内网横向移动1.1 WMI进行横向移动1.1.1 利用条件:1.1.1 利用详情1.1.1.1 wmic1.1.1.1.1 正向shell上线1.1.1.1.2 反向shell上线1.1.1.2 cscript(不建议使用)1.1.1.3 wmiexec-impacket1.1.1.4 cs插件1.2 SMB横向移动1.2.1 利用条件:1.2.2 利用详情1.2.2…

基于YOLOv5的火灾检测系统的设计与实现(PyQT页面+YOLOv5模型+数据集)

基于YOLOv5的火灾检测系统的设计与实现 概述系统架构主要组件代码结构功能描述YOLOv5检测器视频处理器主窗口详细代码说明YOLOv5检测器类视频处理类主窗口类使用说明环境配置运行程序操作步骤检测示例图像检测视频检测实时检测数据集介绍数据集获取数据集规模YOLOv5模型介绍YOL…

对日期的处理

对日期的处理 对编码进行统一&#xff0c;在脚本最开始&#xff1a; # -*- coding: utf-8 -*-这里涉及到两个操作&#xff0c;一个是将数据进行标准化&#xff0c;比如有些日期是2024/05/06这并不符合日期的标准格式&#xff0c;需要转换成这样的2024-05-06 def tran_std(st…

java基于ssm+jsp 社区疫情防控管理信息系统

1前台首页功能模块 社区疫情防控管理信息系统&#xff0c;在社区疫情防控管理信息系统可以查看首页、物品信息、论坛信息、新闻资讯、我的、跳转到后台等内容&#xff0c;如图1所示。 图1系统首页界面图 用户登录、用户注册&#xff0c;通过注册填写账号、密码、姓名、身份证、…

正则表达式,linux文本三剑客

正则表达式匹配的是文本内容&#xff0c;linux的文本三剑客都是针对文本内容&#xff0c;按行进行匹配 文本三剑客&#xff1a; grep 过滤文本内容 sed 针对文本内容进行增删改查 awd 按行取列 一.grep命令 作用就是使用正则表达式来匹配文本内容 -m 数字&#xff1a;匹配…

在linux系统中使用docker、mysql实例

systemctl 是一个命令行工具&#xff0c;用于控制和管理基于 systemd 的 Linux 发行版中的系统和服务。 启动服务 &#xff1a;使用 systemctl start [service-name] 开始一个服务。 如启动docker&#xff1a;systemctl start docker 停止服务 &#xff1a;使用 systemctl st…

直播预约丨《袋鼠云大数据实操指南》No.3:数据资产管理实操,如何有效进行数据治理

近年来&#xff0c;新质生产力、数据要素及数据资产入表等新兴概念犹如一股强劲的浪潮&#xff0c;持续冲击并革新着企业数字化转型的观念视野&#xff0c;昭示着一个以数据为核心驱动力的新时代正稳步启幕。 面对这些引领经济转型的新兴概念&#xff0c;为了更好地服务于客户…

[Shell编程学习路线]——While循环应用技巧 (详细讲解)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f6e0;️Shell编程专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月20日16点30分 &#x1f004;️文章质量&#xff1a;95分 目录 ————前言———— 基本结构 图示原理 示例 测试 …

链动2+1模式:解锁用户留存与复购的增长密码

大家好&#xff0c;我是吴军&#xff0c;来自一家业界领先的软件开发公司&#xff0c;专注于为用户打造卓越的产品体验。今天&#xff0c;我想与大家探讨一个在我们产品运营中取得显著成效的策略——链动21模式&#xff0c;以及它是如何助力我们提升用户留存和复购率的。 尽管链…

Android13 WMS窗口层级树

1&#xff0c;认识层级树 可以通过dumpsys activity containers 看到 WMS 层级树的结构 ACTIVITY MANAGER CONTAINERS (dumpsys activity containers) ROOT typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 Displa…

中国能源统计年鉴(1986-2023年)

数据年份&#xff1a;1986-2023年&#xff0c;无1987、1988、1990三年&#xff0c;1991-2023年齐 数据格式&#xff1a;pdf、excel 数据内容&#xff1a;《中国能源统计年鉴》是一部反映中国能源建设、生产、消费、供需平衡的权威性资料书。 共分为7个篇章&#xff1a;1.综合&a…

51-52Windows密码安全性测试与Windows提权

目录 Windows密码安全性测试 一、本地管理员密码如何直接提取 1、直接通过mimikatz读取管理员密码 2、使用laZagne工具读取管理员密码 二、利用Hash远程登录系统 window提权 三、远程webshell执行命令解决 不能执行原因&#xff1a; 解决方法&#xff1a;单独上传cmd.e…