十进制转二进制:求-5的补码,过程如下:-5对应正数5(00000101)→所有位取反(11111010)→加1(11111011),所以-5的补码是11111011。数0的补码表示是唯一的。
二进制转十进制:给定一个有符号二进制数11111011,先减去1等于11111010,再取反00000101,得到的十进制数为-5
|
二进制
|
十进制
|
最小负整数
|
1000 0000
|
-128
|
最大负整数
|
1111 1111
|
-1
|
1.2
有符号
正整数
十进制5对应的二进制为:0000 0101
这不会有任何的变化
|
二进制
|
十进制
|
最小正整数
|
0000 0000
|
0
|
最大正整数
|
0111 1111
|
127
|
十进制转二进制:求-5的补码,过程如下:-5对应正数5(00000101)→所有位取反(11111010)→加1(11111011),所以-5的补码是11111011。数0的补码表示是唯一的。二进制转十进制:给定一个有符号二进制数11111011,先减去1等于11111010,再取反00000101,得到的十进制数为-5。
负数的原码是本身,反码是
符号
位
不变,其他
位
按
位
取反,补码是反码加1;
3.回归正题,所以对于有
符号
数10000000,我们显然知道它是一个负数,我们想把它变
成
对应的
十进制
数应该先写出它的原码;负数原码的求法是:
符号
位
不变,其他
位
减一取反;我们可以得到10000000,所以它的原码看起来是一个-0,我们将它约定
成
为-128;
这也是为什么,8
位
有
符号
数,取值范围是-128,
意思是把一个带
符号
的
二进制
转化为对应的
十进制
,比如这个
二进制
首
位
是1,那么转化过来的10进制是个负数,这个
二进制
数是用一个10进制来表示的。应该自己不会看晕了吧。代码是复制别人的,谢谢那
位
同学,转载了一下。 http://bbs.csdn.net/topics/390051765#new_post //把带
符号
的
二进制
数直接
转换
成
十进制
,这个
二进制
是10进制数表示的
对于不满一个字节的数据(8
位
),在计算时系统一般是补全,最高
位
为1,则补1,最高
位
为0则补0。
例如1000,系统默认补全是:1111 1000;如果是0100,补全为0000 0100;
补码的补码就是原码,那么对补码1000求补码,也就是对1111 1000求补码,得到:1000 1000,所以等于-8。
在
计算机
编程过程中,各种进制的
转换
很多,
二进制
转为
十进制
在C语言中有强制
转换
的方式。在CAN报文解析的时候,从数据中取出的
二进制
端,长度可能不是正好一个字节,这个时候如果要求数据是有
符号
的,需要单独写程序。
首先我们需要理解有
符号
和无
符号
变量的区别,以1个字节
十进制
为例,有
符号
的取值范围为-127~+127,无
符号
取值范围为0-255;那么同一组
二进制
数据在转
成
有
符号
和无
符号
变量时有什么关联呢?
通常我们将
二进制
数据进行反码、补码计算,再进行
转换
,计算比较复杂。
假设一个
二进制
数据为1000..
1110 1100(EC)为负数,后7
位
的值为6c,即108,128-108=20,此数为-20
1111 1111(FF)为负数,后7
位
的值为7f,即127,128-127=1,数为-1
0100 1110(CE)为正数,后7
位
的值为4e,即78,此数为 78
对于正数,是原数(unsigned)。
1. signed char为8bit=1Byte,bit[0]w为
符号
位
,0表示结果是正数,为0表示结果是负数。
2. 原码、反码、补码之间的变换都和
符号
位
无关,之和后7
位
有关
3. 正数的三种编码方式的结果都相同:
[+1] = [00000001]原 = [00000001]反 = [00000001]补
角度数据采用8
位
有
符号
数(signed char),单
位
:度(°),范围: -90°~ 90°
//角度20
//[+20] = [0001 0100]原 = [0001 010...
(即 有
符号
的
二进制
表示较无
符号
的少了1/2(这里指非负数和负数要各占一半),这就能解释为何
int型取值范围为:-2^31 ~ 2^31-1,而unsigned int(无
符号
整数
型)取值范围为:2^32)
正变负 :各个
位
数取反再加一
负变正 :各个
位
数减一再取反(等同于取反再加一)
0011.
帮研究生同学写的一个数制
转换
代码,将
二进制
数据
转换
为
十进制
数,需
转换
的数据格式为:
1.每行数据的第一个数为任意数制,仅作为标识,可能为正,也可能为负,无需
转换
,直接去除;
2.每行余下的数据为
二进制
数据,并以'b'结尾,每个数的第一
位
为
符号
位
,若为'1'则为负,否则为正;
由于时间比较仓促,所以写的比较繁琐,基本上是逐
位
转换
。代码也比较有针对性,但是只需稍作变更即可用于其它数制之间的
转换
。
聊
二进制
数的运算前,我们先看看
二进制
数的值与
十进制
数的值是如何相互
转换
的,
十进制
转换
成
二进制
将
十进制
数除以2,得到的商再除以2,依次类推直到商为1时为止,然后在旁边标出各步的余数,最后从下往上倒着写出来,高
位
补零就可以
成
功
转换
成
二进制
。
例如下图49的
二进制
数就是110001
二进制转换
成
十进制
只需将
二进制
数的各数
位
的值和
位
权相乘,然后将相乘的结果相加即可,有木有...
在 MATLAB 中,可以使用 bin2dec 函数将一个
二进制
数
转换
为
十进制
数。但是,如果这个
二进制
数是一个有
符号
整数
的补码表示,那么需要进行一些额外的操作才能将其
转换
为有
符号
整数
。
假设你的十六
位
二进制
数是一个有
符号
整数
的补码表示,那么可以按照以下步骤将其
转换
为有
符号
整数
:
1. 将十六
位
二进制
数
转换
为 MATLAB 中的
整数
类型。
2. 判断这个
整数
的最高
位
是否为 1,如果为 1,则说明这个
二进制
数代表的是一个负数。
3. 如果这个
二进制
数代表的是一个负数,则需要进行如下操作:
a. 将这个
整数
减去 2^15,得到它的反码表示。
b. 将反码表示取反,得到它的补码表示。
4. 如果这个
二进制
数代表的是一个正数,则直接使用 bin2dec 函数将其
转换
为
十进制
数。
以下是一个示例代码:
% 假设你的十六
位
二进制
数是 '1101111101101000'
binStr = '1101111101101000';
% 将
二进制
数
转换
为 MATLAB 中的
整数
类型
num = bin2dec(binStr);
% 判断最高
位
是否为 1
if binStr(1) == '1'
% 如果是负数,则进行如下操作
num = num - 2^15; % 得到反码表示
num = bitcmp(num, 16); % 得到补码表示
% 输出结果
disp(num);
这个代码的输出结果应该是一个有
符号
整数
,可以正常进行计算。注意,在这个示例代码中,假设你的十六
位
二进制
数是一个有
符号
整数
的补码表示,如果是其他的
二进制
表示,可能需要进行不同的
转换
操作。