C语言学习——进制转换

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

进制转换:

日常生活中使用的是十进制数据,由于计算机的物理特性导致它只能识别二进制数据,我们在编程时使用的10进制数据,会被计算机转换成二进制数据再运算,为了理解编程时的一些奇怪现象,我们需要掌握二进制数据、八进制数据、十六进制数据。

二进制数据:

由0~1两个数字组成,逢2进1,由于计算机的运算器只能识别高低两种电流,所以它在运算时只能识别二进制数据。

十进制转换成二进制:

假如把x转换成二进制,x/2记录下余数,然后对商继续除以2,重复这个过程,直到商为0结束,然后把记录的余数倒序汇总,就得到了x的二进制。

例如:117转换成二进制
    117 / 2 余数1
    58 / 2 余数0
    29 / 2 余数1
    14 / 2 余数0
    7 / 2 余数1
    3 / 2 余数1
    1 / 2 余数1
    0
    117的二进制就是:1110101

八进制数据:

由0~7八个数字组成,逢8进1,早期使用它记录二进制数据,现在基本不再使用,文件的权限还依然使用8进制数据表示,所以还无法退出历史。

二进制数据转换八进制:

三位二进制对应一位八进制。

    000 0
    001 1
    010 2
    011 3
    100 4
    101 5
    110 6
    111 7
注意:

在C代码中,以0开头的是八进制数据,以%o输出的也八进制数据。

十六进制数据:

由0~9和a~f十六个字符组成,随着计算机的发展CPU的位数越来越多,输出的二进制也越来越长,随后科学家又发明出十六进制用于记用二进制数据。

二进制转换成十六进制:

四位二进制对应一位十六进制,超过9的用字母ABCDEF表示(不区分大小写)。

    1000 8
    1001 9
    1010 a
    1011 b
    1100 c
    1101 d
    1110 e 
    1111 f 

注意:

在C代码中,以0x开头的是十六进制数据,以%x,%p输出的是十六进制数据。

0713

任意进制转换成十进制:

每一个非0位带该公式求和 v*b^(n-1) 就得到了十进制。 ​ v 值 ​ b 进制 ​ n 位数

关于进制转换可能遇到的笔试题:

1、十进制转换成二进制、八进制、十六进制(以%o或%x为输出占位符)

统一先转换成二进制,然后再把二进制转换成八进制或十六进制。

2、在代码阅读题中遇到0123或0xabcdf

0开头的是8进制,0x开头的是十六进制,可以先转换成二进制再转换10进制,然后再运算。

3、输入一个整数转换成N进制(2<= N <= 35)

原码、反码、补码:

原码:

整数的绝对值转换成二进制,叫原码。

反码:

原码按位求反,叫反码。

补码:

正数的原码就是补码,负数的反码+1是补码。

十进制的数据是以补码形式存储在计算机中的,因为计算机的CPU中只有加法器,也就是只能运算加法,其它运算都是使用加法模拟的。

为了能计算出a-b也就是a + -b 所以需要使用特殊格式存储负数。

// 以8位计算机为例
24 - 15
24 + -15
00001111 -15的原码
11110000 -15的反码
11110001 -15的补码   
00011000 24的补码
00001001 结果是9
    
// 以32位计算机为例
00000000 00000000 00000000 00001111 -15的原码
11111111 11111111 11111111 11110000 -15的反码
11111111 11111111 11111111 11110001 -15的补码  
00000000 00000000 00000000 00011000 24的补码
00000000 00000000 00000000 00001001 结果是9
    
0xfffffff1
    
​

补码转换成十进制整数:

补码的两种解析方式:

无符号解析:

由于无符号数据全部是正数,所以补码就是原码,直接转换成十进制即可。

有符号解析:

根据补码的最高位判断它是整数的补码还是负数的补码。

最高位是1:它必然是负数的补码。

1、补码-1得到反码

2、反码按位求反,得到原码

3、原码转换成十进制数据,并在结果的前面加上负号。

最高位是0:它必然是正数的补码,直接转换成十进制即可。

int num = 11111111 11111111 11111011 00101110;
1、由于最高位是1,它必须是负数的补码
2、补码-1 得到反码
    11111111 11111111 11111011 00101101
3、反码 按位求反 得到 原码
    00000000 00000000 00000100 11010010
    1024+128+64+16+2 
    -1234

注意:

当遇到补码转换成十进制数据的笔试题时,必须有是否是有符号信息。

// 假如以下变量的补码是10110011,代码会输出什么,补码的符号信息已经包含在代码中了
char num;
printf("%hhd",num);
10110011
10110010
01001101
64+8+4+1   
-77

// 把以下补码转换成十进制数据,条件不够充分
11001100

注意:

一个整型变量的取值范围是环型状的,当它是最大值时再加1就会变成最小值,当它是最小值时减1就是变成最大值。

以char类型数据为例:
-128 
10000000 补码
01111111 -1后的补码,转换成十进制的结果是127
    
127
01111111 补码
10000000 加1后的补码,转换成十进制的结果是-128

char特殊的补码:
10000000 最小值(最高位是1,其余全是0)
01111111 最大值(最高位是0,其余全是1)
11111111 -1(所有二进制位都是)
// 以下循环执行多少次:
char cnt = 7, n = 0;
while(cnt)
{
   cnt -= 3;
    n++;
}
printf("%hhd\n",n);

7 	 45
-128  1
125   42
-1    42
-127  1
126   42
0     173

位运算符:

位运算符是针对数据的补码进行运算。

A & B 按位与运算,它是针对数据的补码进行按位与运算
    0 & 0 结果是0
    0 & 1 结果是0
    1 & 0 结果是0
    1 & 1 结果是1

A | B 按位与运算
    0 | 0 结果是0
    0 | 1 结果是1
    1 | 0 结果是1
    1 | 1 结果是1

A ^ B 按位异或运算
    0 ^ 0 结果是0 
    0 ^ 1 结果是1 
    1 ^ 0 结果是1 
    1 ^ 1 结果是0

~A 按位求反,是单目运算符
    ~0 结果是1 
    ~1 结果是0

x << n 把x的补码前n位丢掉,末尾补上n个0,按位左移。
    10101100 << 3 01100000
    
x >> n 把x的补码后n位丢掉,前面n位,如果x是正数则补0,如果是负数则补1。
    char num = -3;
    printf("%hhd\n",num >> 2+1);
C语言中各进制之间的转换 在C语言中,进行不同进制之间的转换通常涉及将数字从一种表示形式转换为另一种表示形式。 阅读详情

相关推荐

十进制数和补码之间的相互转换

前言 这么久过去了,对了补码的概念还是云里雾里,只知其然,不知其所以然。也看了不少文章了,还是没理解,有减法转加法和模的概念。那就、那就,先用着吧!!!哈哈哈,以后说不定就懂了。 ——2020/3/30 补码转十进制数的实现 (说不定要要用上呢) 从看过的文章中学来的,与普通2进制数转10进制数的过程几乎一样,但是第一位的计算要乘上(-1)。 Eg. 1111 = -1×1×23 + 1×2...

大锤 1万+

C语言进制转换(全)

此文总结C语言常用的进制转换

炸弹气旋的博客 2万+

[c语言]进值转换的详细代码实现(二进制,十进制,十六进制等)

计算机进制以及进制转换 文章目录计算机进制以及进制转换计算机的多种进制:代码实现(正文):二进制转十进制:十进制转二进制:十六进制转十进制十进制转十六进制 计算机的多种进制: 今天给大家分享一下二进制,十进制,十六进制之间的转换,可谓是干货满满啊。 首先给大家简单介绍一下计算机领域常见的进制:二进制,八进制,十进制,十六进制。 二进制: 逢二进一,数字中只有0 和 1。 其中S代表1个数码,k是数码的位置量,底数是2。 八进制: 逢八进一,数字中含有0,1,2,3,4,5,6,7。 其中S代表1个数码

qq_51399192的博客 3万+

C语言进制转换

进制转换非常简单,但又非常重要,在初学过程中是必须掌握的基础知识

weixin_65334260的博客 3万+

C语言学习 --- 进制转换

如果有错误欢迎指正,有大佬的话可以带带我!

傑的博客 1440

C语言学习笔记--进制转换

什么是进制? 进制是一种带进位的计数方法。对任何一种进制---N进制,都有逢N进一的运算方法。 在计算机中,常用到的进制有十进制、二进制、八进制、十六进制,它们的进制运算规则分别是:逢十进一、逢二进一、逢八进一、逢十六进一。

qq_48309851的博客 2191

C语言学习-进制转换、变量

     虽然我是计算机专业毕业的,也学过C语言,之前去网上也自学了一下C语言和OC语言,但是为了把基础打好,我把自己当成一个新人,重新把这C语言和OC语言学好。好的不说这些了,进入正题,不然大家都要说我跑偏了。。。哈哈!   今天主要学习了进制和进制之间的转换、简单程序的一般形式、基础数据类型、常量、变量、运算符、表达式、printf、scanf函数。 一、进制   大家在平时当时,是用...

weixin_33860147的博客 293

C语言学习记录——BC95 小乐乐与进制转换

C语言学习记录——BC95 小乐乐与进制转换

m0_73311236的博客 632

C语言学习日志(进制转换及数据类型)

1.23L//识别为 long double //16个字节。总结:二进制转八进制时以三位数为一组,转十六进制时以四位数为一组。//指数部分 可以是负数,但是不能是小数。将10进制形式的小数,转换为 二进制形式的小数。将二进制形式的小数,写成科学计数法形式。结果 --- 是字节的个数。111011 //1位八进制数 对应 3位二进制数。(1).整数部分 --- 除2取余法。(2).小数部分 --- 乘2取整法。1.十进制 转 n进制 -- 除n取余法。

2401_87702151的博客 732

c语言 字母 八进制表示'/1011',C语言学习-进制转换、变量

虽然我是计算机专业毕业的,也学过C语言,之前去网上也自学了一下C语言和OC语言,但是为了把基础打好,我把自己当成一个新人,重新把这C语言和OC语言学好。好的不说这些了,进入正题,不然大家都要说我跑偏了。。。哈哈!今天主要学习了进制和进制之间的转换、简单程序的一般形式、基础数据类型、常量、变量、运算符、表达式、printf、scanf函数。一、进制大家在平时当时,是用十进制来计数的,如“十”,我们可...

weixin_35598388的博客 3710

C语言学习进制转换与操作符)

摘要:本文系统介绍了进制转换与位运算知识,包括:1)二进制、八进制、十六进制与十进制的相互转换方法;2)C语言中不同进制的占位符(%d、%o、%x)使用;3)位运算技巧(移位、异或交换变量、统计1的个数、位设置等);4)逗号表达式和函数操作符的应用。重点讲解了二进制补码操作、无临时变量交换整数等实用编程技巧,并提供了完整的C语言代码示例。

sksnxn的博客 275

c语言学习笔记6之进制转换

我们要知道我们的电脑只能识别1和0,而它识别的方式就是通过电路的接通与断开也就是开关的开和闭。所以一个开关有两种情况,即1和0 两个开关有4种情况,11(开开),10(开关),00(关关)01(关开) 由此引申到了二进制,即逢二进一,例如1为1,2为10,4为100,8为1000 我们习惯都是用十进制来表示数,所以涉及到了进制的转换常用的进制有二进制,八进制,十进制,十六进制。生活中也有进制

人工zz研究员的博客 634

c语言学习一:原码、反码、补码、进制转换

1.字节 1B = 8 b 2.存放 计算机中存放数据是以补码的形式存放的 3.机器数 数字在计算机三的二进制表现形式、可以理解为原码 4.真数 机器数对应的10进制数,例如 机器数:01101对应的真数就是+1101 5.原码 计算机中对二进制的表示方式,首位表示正负,0正,1负 6.反码 为了解决负数的加法问题引入了反码,正数的反码是本身,负数的反码按位取反 7.补码 解决1111111和00000000都表示零时对每次跨零的运算产生一个单位的误差,引入了补码。正数的补码是其本身,负数的补码等于她本.

八十岁老将的博客 819

C语言学习3——核心语法2(数据类型和进制转换)

因此,知道数据类型占用内存的大小,就能算出该类型 无符号数、有符号数 对应的取值范围。需要拿出一个二进制位,专门存储符号。是计算机内存存储的最小单位, 一个内存单元。反码:符号位不变,将其余数值为取反。将 大写字母,转换成 小写字母。类型实现的精度有可能不同。统统都是给人类用的!源码:数值的二进制位直接存储。位,可能准确,也可能不准确。位,可能准确,也可能不准确。将普通字符,转换为 特殊意。将特殊字符,还原成本身意。位 就是一个 二进制位。进制数,自左向右,每一位,用。进制数,自左向右,每一位,用。

xwn6926074的博客 1478

C语言学习笔记--10进制转换为2,8,16进制

在转换为八进制时,结果的顺序是反的。这是因为我们在计算八进制时,是从最低位开始计算的,但是在存储结果时,却是从最高位开始存储的。这导致了结果的逆序。

m0_56760139的博客 490

C语言学习系列二十九——字符串进制转换

十六进制字符转换成十进制数表达式: number=number*16+hexad[i]-'0'; //数字字符 number=number*16+hexad[i]-'A'+10; //大写英文字符 number=number*16+hexad[i]-'a'+10; //小写英文字符 //例7-14 //滤去所有非十六...

超人琪的博客 521

C语言学习笔记:while循环实现2进制转换

在这个代码内,我们首先声明了整型变量n,这代表我们输入的数,i 则是计数器,因为我们让n/2后的余数存储到数组内,就需要一个计数器来作为索引,即第一次循环结果存储到a[0],第二个存储到a[1]……然后我们声明数组,因为我们数组的大小是根据循环次数来定义的,所以我们没办法直接初始化,但是当输入 0和1时都有不进入循环的情况,所以数组内有垃圾值,我们需要进行初始化。在进行转换时,先让输入的十进制数对2取余,这个值存入到数组内,然后让输入值除以2,再次进行循环,直到输入的数为0。

2301_80548884的博客 462

C语言学习初级阶段(数据)——整型进制转换

每4个位单独看 从右往左看 为2的0次 2的1次 2的2次 2的3次。从二进制变成8进制后,得到的数,从右往左为8的0次 8的1次 8的2次。每3个位单独看 从右往左看 为2的0次 2的1次 2的2次 2的3次。例如:173 1x8的2次+7x8的1次+3x8的0次。1字节为8位,1位即二进制的一位,他存储成0或1。123化二进制为0111 1011 最前面补0。int型常量的大小位4字节,即32位。123转16进制 除以16。十六进制 0-9 a-f。1KB=1024个字节。123转8进制 除以8。

浪漫的诗人博客 550

C语言学习笔记1——10进制转换2进制(递归调用)

一、代码如下: #include<stdio.h> void fun(int n) { if(n/2) fun(n/2); printf("%d",n%2); } int main() { fun(10); printf("\n"); return 0; } 二、代码执行流程: 主要执行段: if(n/2) fun(n/2); printf("%d",n%2); 程序第一次执行: if(10/2=5≠...

weixin_45204821的博客 1269
上一篇: Linux系统——C语言的学习(二维数组、函数)
下一篇: 2048小游戏-C语言版本
DomKing-AI
博客等级 码龄5年 5粉丝 25原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值