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语言:进制转换以及原码、反码、补码
|
4月前
|
C语言
C语言进阶(反码和补码)
C语言进阶(反码和补码)
43 0
|
7月前
|
存储 编译器 C语言
C语言(二) 补码,运算值与表达式
C语言(二) 补码,运算值与表达式
110 0
|
10月前
|
存储 算法 编译器
C语言中的小知识点(1)(涉及unsigned讲解,原码反码补码的讲解,以及指针的讲解)
C语言中的小知识点(1)(涉及unsigned讲解,原码反码补码的讲解,以及指针的讲解)
96 0
|
11月前
|
C语言
【C语言】输入一个整数,输出该数二进制表示中1的个数,其中负数用补码表示
输入一个整数,输出该数二进制表示中1的个数,其中负数用补码表示
|
存储 算法 编译器
【C语言】数据类型存储、原码,反码,补码
是这个类型一旦确定之后就决定了它的内存空间的大小,也决定了它的这个范围有多大。举个例子就像:当你把一个变量a的值赋值给了int整形,那么它的存储大小就是4个字节取值的
153 0
【C语言】数据类型存储、原码,反码,补码
|
C语言
C语言: 输入一批正整数(以零或负数为结束标志),求其中的奇数和。要求定义和调用函数int even(int n)判断整数n的奇偶性,当为奇数时返回1,否则返回0。
C语言: 输入一批正整数(以零或负数为结束标志),求其中的奇数和。要求定义和调用函数int even(int n)判断整数n的奇偶性,当为奇数时返回1,否则返回0。
1282 0
C语言: 输入一批正整数(以零或负数为结束标志),求其中的奇数和。要求定义和调用函数int even(int n)判断整数n的奇偶性,当为奇数时返回1,否则返回0。
|
C语言 人工智能
C语言数组下标是负数
   1 #include 2 #include 3 using namespace std; 4 5 int main(int argc, char *argv[]) 6 { 7 int a[10]; 8 int i, j, k; 9 ...
803 0
|
C语言 BI 人工智能
C语言数组下标是负数
        编程时我们经常会遇到处理边界问题的情况,这时数组的下标可能是从负数开始的。通常的方法是将边界分离出来单独处理,但这样比较麻烦,程序读起来也比较费力。
1105 0