C 语言学习(11)

您所在的位置:网站首页 进制转换的方法大全 C 语言学习(11)

C 语言学习(11)

2023-05-20 04:53| 来源: 网络整理| 查看: 265

进制转换

十六进制/十进制/二进制的互转方式如下

进制转换.jpg

二进制和十进制的互转 十进制转二进制采用除2取余数,逆序排列的方法 二进制转十进制每遇到一个二进制的1,乘以相应的阶数(阶数等于这一位后有多少二进制位)最后相加得到结果

二进制互转十进制.jpg

二进制和十六进制的互转 每四个二进制位代表一个的十六进制位,二进制转十六进制每四位合并为一位,十六进制转二进制每一位展开为4个二进制位

十六进制互转表.jpg

十进制和十六进制互转 十进制转十六进制,除以16,取得到的余数,最后逆序排列 十六进制转十进制,每遇到一个16进制位,乘以相应的阶数(阶数等于这一位后有多少二进制位),最后相加得到结果

十进制和十六进制互转jpg.jpg 正数和负数的二进制表示

原码:如果想要表示有符号整数,就要将最前面一个二进制位作为符号位,即 0 代表正数,1代表负数,后面 7 位为数值域 反码:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外 补码:正数的补码与其原码相同,负数的补码是在其反码的末位加1

引入补码的原因: 如果负数和正数都采用原码的方式,仅使用符号位区分,数学上,1 + (-1)=0,换算成在二进制中00000001+10000001=10000010,换算成十进制为-2,显然出错了,所以原码的符号位不能直接参与运算,必须和其他位分开,需要设计两种加法电路加以区分,这就增加了硬件的开销和复杂性 所以引入补码是为了解决计算机中数的表示和数的运算问题,使用补码,可以将符号位和数值域统一处理 +1 的二进制原码00000001 -1 二进制补码 11111111,相加之后的和为 0,符合数学运算的结果 负数的补码要保证和对应的正数相加结果为0,包括符号位 负数的补码是在其反码的末位加1是补码的一个重要性质

另外,补码下的 0 就只有一个表示方式,因此在判断数字是否为 0 时,只要比较一次即可

负数二进制补码转换成十进制的

给出负数补码 1000 1000,如何计算其十进制表示?

定义法 对补码先减去1,然后再取反 比如:1000 1000 减一结果1000 0111,取反后0111 1000,0111 1000 转换成十进制2^6 + 2^5 + 2^4 + 2^3 = 120,,所以为1000 1000 表示 -120

相加为 0 法 负数的补码和对应的正数补码(原码)相加为 0 1000 1000 对应的相加为 0 的原码为 0111 1000,转换成十进制2^6 + 2^5 + 2^4 + 2^3 = 120,所以为1000 1000 表示 -120

乘以阶数相加法 符号位对应的结果为乘以阶数,符号位负 1000 1000 1 作为符号位,对应 -2^7 = -128,准换成十进制 - 2^7 + 2^3 = -128 + 8 = -120

注意 定义法和相加为 0 法有一个bug,比如带符号的八位二进制数 1000 000,表示的十进制数是多少? 结果是 -128,这是一个标准定义

signed char 表示的数据范围

char 型变量占用 8 个位,对于 signed char 类型,最高位表示符号位,此时有 7 个位用于表示数值。按照数学中的排列组合,7 个位能够表示 2^7 也即 128 个不同的数,若考虑正负号,signed char 类型最多也能表示 2*128 = 256 个不同的数

但是,如果 signed char 类型能够表示的数值范围是 -127 到 127,那么能够表示的只有 255 个不同的数字了,与理论最大能够表示的不同数字数 256 相比,少了一个,这是因为 -0 和 +0 其实是同一个数字,也即 0b10000000 和 0b00000000 是同一个数字 0 这对于计算机来说很不友好,同样的一个数字有两种二进制码,在处理时会显得很麻烦

因为 -0 和 +0 其实是同一个数字,因此原码中 1000 0000 和 0000 0000 都表示数字 0,现在补码下的 0 只有一个表示方式: 0000 0000,二进制码 1000 0000 就多余出来了,在此定义为 -128

在C语言中,signed char 型二进制码 0b10000000 的补码仍然为 0b10000000,因此它是“数字a的补码为 -a”原则的例外

模运算

对于 8 位字长的有符号整数类型,以 2^8 即 256 为模,对于其加减法运算

-128 = 128 (mod 256) -127 = 129 (mod 256)...-2 = 254 (mod 256) -1 = 255 (mod 256) 所以模 256 下的加减法,用 0, 1, 2,…, 254,255 表示其值,或者用 −128, −127,…, −1, 0, 1, 2,…,127 是完全等价的

−128与128,−127与129,…,−2与254,−1与255 可以互换而加减法的结果不变,需要的 CPU 加法运算器的电路实现与 8 位无符号整数并无不同

所以负数采用补码表示,等价于去除符号位的正数,-1 可以理解为 255,这样减法运算用加法运算器的电路就可以实现

8位有符号的运算 -1 + 10 等等价于 255 + 10 二进制表示为 1111 1111 + 0000 1010 得到结果 1 0000 1001,溢出的进位被自动舍弃,得到结果 0000 10001

相应的16位整形数的二进制加减法运算,等同于模 65536(2^16)的加法运算 32位整形数的二进制加减法运算,等同于模 2^32 的加法运算

浮点数的二进制表示

https://blog.csdn.net/jiaoyangwm/article/details/129296459



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3