c语言实现负数转补码

简介: c语言实现负数转补码

为什么c语言中可以用补码来表示负数
计算机中,只有加法器,没有减法器。

负数,必须转换成正数(即补码),用加法来计算。

你看十进制:

24 - 1 = 23

24 + 99 = (1) 23

舍弃进位,+99 就可以代替-1。

+99 就称为-1 的补数。

负数的补数= 负数+10^n, n 是位数。

二进制的补码,也是这样计算出来的。

负数的补码= 负数+2^n, n 是位数。

补码,与原码反码符号位,并无关系。

取反加一的理论,是不存在的。

c语言实现负数转补码

c语言中,负数的补码怎么取的?以-127为例!
将所有位取反,再在最后一位+1

比如16位二进制补码-127

首先得到127这个数

00000000 01111111

然后所有位取反

11111111 10000000

再在末位+1,得到-127的补码为

11111111 10000001

如果将这个数化成10进制,可以这样:

先看最高位,是1,就写上负号(是0就不用写,直接化成10进制就行,后面的就不需要做了),得到一个光秃秃的负号

然后将所有位取反得

00000000 01111110

再在末位加1,得

00000000 01111111

将这个数化成10进制,是127,然后写在第一步的负号后面,得出这个补码对应的10进制数是-127

C语言之负数的补码
对于有符号数(分正负的),的最高位是符号位

65的二进制是 0 1000001

补码运算为按位取反 再加1

按位取反:1 0111110

加1: 1 0111111

直接转换为十进制的话,你把它当成无符号数把1也算了,所以不是-65

从 10111111到-65:

计算机根据符号位为1判断是负数

按位取反:01000000

加1: 01000001

这就是65,然后是负数,就是-65

C语言中负数的补码的问题
谭浩强说的方法适用于数字位数小于字长的情况,也就是符号位不能被覆盖。像-127,只有在规定字长大于8位(含符号位)的情况下,才能适用。两种方法都可以。谭浩强写的很多东西都喜欢把简单的东西复杂化,让新手反而不理解了。最直观的理解方法就是方法1,负数符号位就是1,符号位不变,把去掉符号位后的绝对值部分取反,然后加1,就是负数的补码。

C1111010111110110

所有的数据, 什么视频, 图片, 音频, 汉字, 字母, 数字, 统统都是以二进制的形式表示的。

为了区分方便程序识别,在每个层次上都有相应的规范,

其中 正负数的表示之间的区分就是, 负数的表示方法是在正数的基础上 反码, 再加上1;就是对应的负数了,

比如3的整数表示就是原码00000011 负数就是反码11111100 加1,11111101就是-3在计算机中的存在形式;

C语言负数的补码怎么转换的?如-12345怎么转化为53191的
这是有符号和无符号数值的理解,这个数在内存中的值是一样的。

二进制

1100

1111

1100

0111

如果按有符号位进行表示就是:-12345

如果按无符号的整数来理解,表示后就是:

53191

转换代码:

int

x=

-12345;

printf("%d

%d\n",x,(unsigned)(x0xffff));

补充

对于你说的问题,可以先看-1补码

我们先看-1绝对值的二进制是0000

0001(对于把为存储)

第一位是符号

接下来去补码为取反操作:1111

1110

在加1

的1111

1111

相关文章
|
2月前
|
存储 C语言
【C语言进阶篇】整数在内存的存储——原码、反码、补码
【C语言进阶篇】整数在内存的存储——原码、反码、补码
|
3月前
|
存储 程序员 编译器
C语言:深入补码计算原理
C语言:深入补码计算原理
36 2
|
3月前
|
存储 编译器 C语言
【C语言】数据的存储(基本类型介绍、原码、反码、补码详解、大小端的理解、浮点数的存储规则)
【C语言】数据的存储(基本类型介绍、原码、反码、补码详解、大小端的理解、浮点数的存储规则)
45 0
|
3月前
|
存储 编译器 C语言
C语言中的原码、反码和补码
C语言中的原码、反码和补码
43 0
|
3月前
|
存储 编译器 C语言
爱上C语言:整型和浮点型在内存中的存储(进制转换,原码,反码,补码以及大小端)
爱上C语言:整型和浮点型在内存中的存储(进制转换,原码,反码,补码以及大小端)
|
3月前
|
存储 编译器 C语言
C语言:进制转换以及原码、反码、补码
C语言:进制转换以及原码、反码、补码
|
3月前
|
C语言
C语言进阶(反码和补码)
C语言进阶(反码和补码)
63 0
|
11月前
|
存储 编译器 C语言
C语言(二) 补码,运算值与表达式
C语言(二) 补码,运算值与表达式
135 0
|
存储 算法 编译器
C语言中的小知识点(1)(涉及unsigned讲解,原码反码补码的讲解,以及指针的讲解)
C语言中的小知识点(1)(涉及unsigned讲解,原码反码补码的讲解,以及指针的讲解)
113 0
|
C语言 Python
【C语言】负数取模、取余
首先谈谈关于数学取整的问题