c语言负数补码
⑴ c语言负数的补码怎么转换的如-12345怎么转化为53191的
数在计算机中是以二进制形式表示的。
数分为有符号数和无符号数。
原码、反码、补码都是有符号定点数的表示方法。
一个有符号定点数的最高位为符号位,0是正,1是副。
以下都以8位整数为例,
原码就是这个数本身的二进制形式。
例如
1000001
就是-1
0000001
就是+1
正数的反码和补码都是和原码相同。
负数的反码是将其原码除符号位之外的各位求反
[-3]反=[10000011]反=11111100
负数的补码是将其原码除符号位之外的各位求反之后在末位再加1。
[-3]补=[10000011]补=11111101
一个数和它的补码是可逆的。
为什么要设立补码呢?
第一是为了能让计算机执行减法:
[a-b]补=a补+(-b)补
第二个原因是为了统一正0和负0
正零:00000000
负零:10000000
这两个数其实都是0,但他们的原码却有不同的表示。
但是他们的补码是一样的,都是00000000
特别注意,如果+1之后有进位的,要一直往前进位,包括符号位!(这和反码是不同的!)
[10000000]补
=[10000000]反+1
=11111111+1
=(1)00000000
=00000000(最高位溢出了,符号位变成了0)
有人会问
10000000这个补码表示的哪个数的补码呢?
其实这是一个规定,这个数表示的是-128
所以n位补码能表示的范围是
-2^(n-1)到2^(n-1)-1
比n位原码能表示的数多一个
⑵ 在c语言中怎么表示负数。
第一位符号位1为负,0为正。 正数的补码和2进制原码是一样的。
负数的补码:
1、先取绝对值|x| ;
2、对|X|+1 ;
3、对|X|+1 取反,就得到它的补码了 。
计算机中存放整型数据都是按补码的形式存放的。
(2)c语言负数补码扩展阅读:
有符号数的表示方法是由硬件决定,而不是由C决定的。有三种表示方法:
1、二进制原码
0000 0001 表示 1
1000 0001 表示 -1
这个方法有个缺点是有两个零: +0 和 -0。这会引起混淆,而且用两个位组合来表示一个值也有些浪费。
2、二进制补码(最普遍的系统)
区别在于 singned 和 unsigned:
1)如果是无符号字节, 1000 0000 该组合为 128
2)如果是有符号字节, 1000 0000 该组合为 -128
第一种表示数的范围是 0 ~ 255;
第二种表示数的范围是 -128 ~ +127,对于一个二进制补码数取负数,最简单的方法就是取反、加 1。
3、二进制反码
通过反转位组合中的每一位以形成一个数的负数,例如:
0000 0001 表示 1
1111 1110 表示 -1
这种方式也有一个 -0:1111 1111。其范围是 -127 ~ +127。
⑶ C语言中负数的补码的问题
谭浩强说的方法适用于数字位数小于字长的情况,也就是符号位不能被覆盖。像-127,只有在规定字长大于8位(含符号位)的情况下,才能适用。两种方法都可以。谭浩强写的很多东西都喜欢把简单的东西复杂化,让新手反而不理解了。最直观的理解方法就是方法1,负数符号位就是1,符号位不变,把去掉符号位后的绝对值部分取反,然后加1,就是负数的补码。
⑷ C语言中为什么用补码表示负数,而不是直接在正数的前面加1呢
为什么用补码表示负数?
原理:用加法运算,也可以产生减法的效果。
目的:简化计算机的硬件。
在两位数之内,+99,就可以代替-1。
如:24 - 1 = 23
24 + 99 = (1) 23
只取两位,这两种算法,功能就是相同的。
加上 99,就相当于,减一!
物极必反,听说过吧?
99,就是-1 的补数。
-------------------
钟表的分针,正拨 59,也相当于倒拨 1 分钟!
-------------------
计算机用二进制,就改称为:补码。
八位二进制:0000 0000~1111 1111(十进制255)。
255(=1111 1111),就是-1 的补码。
254(=1111 1110),就是-2 的补码。
。。。
负数的补码 = 2^n + 该负数。(n 是二进制的位数。)
借助于补码,在计算机中,只需配置一个加法器,即可。
正数,没有补码,直接参加计算即可。
⑸ 为什么c语言中可以用补码来表示负数
不是c语言用补码表示负数,而是计算机用补码表示负数
因为用补码的话,加法器直接做加减运算就可以了,不再需要考虑正负号问题
⑹ c语言初学者求解关于负数补码存储
出去晒晒太阳吧,原理明白了就好,没必要钻牛角尖。
计算机存储都是二进制,八进制和十六进制亦或十进制都是用来输入输出表示的,如果你的程序用来编辑或显示内存实际数据,一般用十六进制显示,因为十六进制相对二进制简短而且1位16进制对应4位二进制,非常整齐,为了方便。如果你的程序用来计算一般应用,则以10进制显示,同样为了方便,特殊要求可以用其他任意进制显示,根据你需求哪个方便用哪个。
编程语言中,如果定义为整数(int),计算机遇到负数就以补码表示,此时0xffff即为-1;如果定义为uint,则不允许赋值负数(强制转换除外),如果其值为0xffff,则表示正的65535。所以关键在于定义(事先约定)。
而当你得到一个数据0xffff,如果不告诉你约定,或者说数据类型,你是无法知道到底表示-1还是65535的,计算机也如此。
⑺ C语言中负数的补码怎么求
正数,本身就是补码。
负数,就用它的正数,减一取反,即可得到补码。
如,已知:+9 的二进制是:00001001。
下面求-9补码:
先减一:00001001-1=00001000;
再取反:11110111。
所以有:-9补码=11110111。
这不就完了吗!
简不简单?意不意外?
原码反码符号位,讨论这些垃圾干嘛?
这些垃圾,都是用来骗吃骗喝的!
⑻ 怎么求一个负数的原码和补码
正数,本身就是补码。
负数,就用它的正数,减一取反,即可得到补码。
如:+9 的二进制是:0000 1001。
下面求-9 补码:
先减一:0000 1001 - 1 = 0000 1000;
再取反:1111 0111。
所以有:-9 补码 = 1111 0111。
这不就完了吗!
简不简单?意不意外?
原码反码符号位,讨论这些垃圾干嘛?
这些垃圾,只是那些专家用来骗吃骗喝的!
⑼ C语言中 负数在内存中为什么要以补码形式存储
c的char数据属于基本类型,基本类型其中还包括-整型,实型,枚举类型!
数据在内存中是以二进制形式存放的。数值是以补码表示的。
整型:
一个正数的补码和其原码的形式相同。而负数的补码方式是将其绝对值的二进制形式“按位求反再加1”
实型:
在内存中占4个字节,是按照指数形式存储的,实型数据分为小数部分和指数部分,分别存放!计算机用二进制表示小数部分,用2的幂次来表示指数部分!
字符型:
在内存中字符的存储实际上是把字符相对应的ASCII代码放到存储单元中的。而这些ASCII代码值在计算机中也是以二进制形式存放的。这个与整型的存储很相似。因此这两类之间的转换也比较方便!
⑽ C语言之负数的补码
对于有符号数(分正负的),的最高位是符号位
65的二进制是 0 1000001
补码运算为按位取反 再加1
按位取反:1 0111110
加1: 1 0111111
直接转换为十进制的话,你把它当成无符号数把1也算了,所以不是-65
从 10111111到-65:
计算机根据符号位为1判断是负数
按位取反:01000000
加1: 01000001
这就是65,然后是负数,就是-65