搜索
bottom↓
回复: 32

一字节来说,0X80就是-128,两字节的话0X8000就是-32768

[复制链接]

出0入0汤圆

发表于 2016-12-22 22:17:36 | 显示全部楼层 |阅读模式
如何求出来?

大家都知道补码这回事的,请问一字节,这个-128如何求呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2016-12-22 22:34:54 来自手机 | 显示全部楼层
取反加1啊,128=10000000  取反01111111=127  +1不就128  前面加个-就是-128

出0入0汤圆

发表于 2016-12-22 22:37:00 来自手机 | 显示全部楼层
【例2】求-5的补码。 -5对应正数5(00000101)→所有位取反(11111010)→加1(11111011) 所以-5的补码是11111011。

出0入0汤圆

 楼主| 发表于 2016-12-23 08:43:00 | 显示全部楼层
hongfadg 发表于 2016-12-22 22:34
取反加1啊,128=10000000  取反01111111=127  +1不就128  前面加个-就是-128

谁说128=10000000了,最前面一位是符号位。。。。。。

出0入0汤圆

 楼主| 发表于 2016-12-23 08:43:55 | 显示全部楼层
javenreal 发表于 2016-12-22 22:37
【例2】求-5的补码。 -5对应正数5(00000101)→所有位取反(11111010)→加1(11111011) 所以-5的补码是111 ...

你这个-5的求法是对的,问题是这个-128如何求补?

出0入0汤圆

发表于 2016-12-23 09:00:26 | 显示全部楼层
gracialee 发表于 2016-12-23 08:43
谁说128=10000000了,最前面一位是符号位。。。。。。

是你自己混淆概念了,-128的求补码过程,128=1000-0000,全部取反=0111-1111,再加1,得到1000-0000就是-128的补码。虽说面上看都相同,但后一个表示是有符号的数(其范围就是-128-+127),而无符号数范围是0-255。

出0入0汤圆

发表于 2016-12-23 09:09:02 | 显示全部楼层
gracialee 发表于 2016-12-23 08:43
你这个-5的求法是对的,问题是这个-128如何求补?

算法是相同的,不管数字是几,都是用相同的算法或者说相同的公式。 也是取反加1,楼上已经有人列出来了。

出0入93汤圆

发表于 2016-12-23 09:23:30 | 显示全部楼层
gracialee 发表于 2016-12-23 08:43
谁说128=10000000了,最前面一位是符号位。。。。。。

主要是二进制数中,整数和负数数量不平衡导致的。因为有了0的存在,负数总是比正数多出一个数,也就是10000000取反后得01111111,再加1会溢出,你需要将类型提升一个等级或者当做无符号的才可以看出结果出来,而这个结果显然是错的!
0和最高位为1其他位为零的补码都是他自己,也就是说-128的补码还是-128,绝不是什么128。一个字节有符号根本无法表示128出来。

出0入0汤圆

发表于 2016-12-23 09:40:15 | 显示全部楼层
一字节-128求补码就算溢出了

出0入93汤圆

发表于 2016-12-23 09:52:59 | 显示全部楼层
dddddddwolf 发表于 2016-12-23 09:00
是你自己混淆概念了,-128的求补码过程,128=1000-0000,全部取反=0111-1111,再加1,得到1000-0000就是- ...

可以说,是你自己偷换概念了,LZ没有。建议还是重新温习一下计算机术语二进制那章。
对于一字节有符号来说,0和-128的补码就是它本身。你把一个有符号数取反+1,然后就变成无符号数了?显然是不可取的。说128=10000000的就是扯淡,一个字节有符号根本无法表示128好不?
同样,对于两字节来说,0和-32768的补码就是它本身。

出0入0汤圆

发表于 2016-12-23 09:55:44 | 显示全部楼层
gracialee 发表于 2016-12-23 08:43
谁说128=10000000了,最前面一位是符号位。。。。。。

注意看楼主的标题  以及楼主的疑惑 (一字节来说,0X80就是-128..........................,)      肯定是 uchar  转为  char搞不懂啊        (uchar)  128(0x80)   =  (char)    -128         128是uchar类型的

出0入0汤圆

发表于 2016-12-23 10:04:53 | 显示全部楼层
takashiki 发表于 2016-12-23 09:23
主要是二进制数中,整数和负数数量不平衡导致的。因为有了0的存在,负数总是比正数多出一个数,也就是100 ...

楼主没有说是一字节有符号能表示128   而是有疑惑 为什么     uchar = 128    转为char 就是   -128      

出0入0汤圆

发表于 2016-12-23 10:14:39 | 显示全部楼层
简单点来说
1个字节的,-x就是 256 - x
2个字节的,-x就是 65536 - x

出0入4汤圆

发表于 2016-12-23 10:15:03 | 显示全部楼层
attach://355569.jpg

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2016-12-23 10:26:22 | 显示全部楼层

我觉得应该是 -128 ~  127 才是对的

出0入0汤圆

发表于 2016-12-23 10:39:14 | 显示全部楼层
“取反加一”的本质就是模运算。
如果只考虑结果,减去一个数,与加上这个数的补数是一样的。在钟表上,往前调一格与往后调11格效果是一样的。
计算机使用补码的主要原因是可以简化硬件,因为补码可以把减法转为加法,这样就不需要额外的减法器。
求补码的通用方法是用“模减去绝对值”。
例如:
(1)两位十进制数33,模是100,它的补数是100-33=67
(2)8位二进制数的模是1 0000 0000(256),那么 -128的补码就是 1 0000 0000(256) - 1000 0000(128) = 1000 0000(128)
   

出0入0汤圆

发表于 2016-12-23 10:40:22 | 显示全部楼层

stdint.h中
    /* minimum values of exact-width signed integer types */
#define INT8_MIN                   -128
#define INT16_MIN                -32768
#define INT32_MIN          (~0x7fffffff)   /* -2147483648 is unsigned */
#define INT64_MIN  __INT64_C(~0x7fffffffffffffff) /* -9223372036854775808 is unsigned */

    /* maximum values of exact-width signed integer types */
#define INT8_MAX                    127
#define INT16_MAX                 32767
#define INT32_MAX            2147483647
#define INT64_MAX  __INT64_C(9223372036854775807)

出0入0汤圆

 楼主| 发表于 2016-12-23 10:48:37 | 显示全部楼层
dddddddwolf 发表于 2016-12-23 09:00
是你自己混淆概念了,-128的求补码过程,128=1000-0000,全部取反=0111-1111,再加1,得到1000-0000就是- ...

我觉得你这个计算过程完全是错的。

到现在为止我还没有找到权威的能让我信服的答案,不过我有个思路请各位批评:

-128 +1=-127
而-127相信大家都会处理,即81H,那么:
-128+1=81H --> -128=81H-1=80H

如果还纠结减1能否直接这样处理,请看第二思路:

0 1 2 3 。。。127
00H--7FH 这里是没问题的,那么-1是多少?FFH,相信大家会做。-2是多少?FEH。
按此规律一直推下去,-127为81H,正确。再继续住前推一个数,-128,得证80H!

能否说此为数学归纳法?

出0入4汤圆

发表于 2016-12-23 10:57:36 | 显示全部楼层
奇怪,这书怎么这样写的
ISO/IEC 9899:TC2 Committee Draft — May 6, 2005 WG14/N1124
attach://355578.jpg

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2016-12-23 11:05:22 | 显示全部楼层
gracialee 发表于 2016-12-23 10:48
我觉得你这个计算过程完全是错的。

到现在为止我还没有找到权威的能让我信服的答案,不过我有个思路请各 ...

不错,顺水推舟
但是你再想想,1有+1/-1,2有+2/-2,为啥什么数都有正负,就0没有?难道0是二等公民,+0/-0就不能有?
还有你看下C语言标准,为啥是这样规定的:

  
对于二进制数,无非就是一串0、1,把它看成什么类型的数据完全是编译器的事。对于八位二进制数 1000 0000 ,把它看成 -0 还是 -128 也是编译器的规定。
         

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2016-12-23 11:14:05 | 显示全部楼层
laoshuhunya 发表于 2016-12-23 11:05
不错,顺水推舟
但是你再想想,1有+1/-1,2有+2/-2,为啥什么数都有正负,就0没有?难道0是二 ...

大神,,我觉得你说的有道理,,就好像大小端一样,,, 01 00     不同编译器也看法不同,,,有的编译器说是 0x0100     有的编译器说是 0x0001   就是这么回事

出0入8汤圆

发表于 2016-12-23 11:18:04 | 显示全部楼层
ztrx 发表于 2016-12-23 10:57
奇怪,这书怎么这样写的
ISO/IEC 9899:TC2 Committee Draft — May 6, 2005 WG14/N1124
attach://355578.jpg ...

C 标准一般只规定最小范围,
你可以看看你截图的 5.2.4.1 第一段的最后一句,你应该就会明白了。

出0入0汤圆

发表于 2016-12-23 16:20:14 | 显示全部楼层
gracialee 发表于 2016-12-23 10:48
我觉得你这个计算过程完全是错的。

到现在为止我还没有找到权威的能让我信服的答案,不过我有个思路请各 ...

我也只能用这个方法了。

出0入0汤圆

 楼主| 发表于 2016-12-23 17:44:36 | 显示全部楼层


所以,楼上的各位专家,这个输出是多少?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入8汤圆

发表于 2016-12-23 18:13:36 | 显示全部楼层
gracialee 发表于 2016-12-23 17:44
所以,楼上的各位专家,这个输出是多少?


输出 0x8000 和 0xFFFF 的十进制数值:32768, 65535。
有什么问题吗?

出0入0汤圆

 楼主| 发表于 2016-12-23 21:59:29 | 显示全部楼层
security 发表于 2016-12-23 18:13
输出 0x8000 和 0xFFFF 的十进制数值:32768, 65535。
有什么问题吗?

呵呵,这个难不倒你。按教科书c语言对整数的定义,是两字节,即-32768~32767,而此编译器直接就是32位,4字节了?

出0入93汤圆

发表于 2016-12-24 07:21:38 来自手机 | 显示全部楼层
gracialee 发表于 2016-12-23 21:59
呵呵,这个难不倒你。按教科书c语言对整数的定义,是两字节,即-32768~32767,而此编译器直接就是32位, ...

你的哪本教科书c语言对整数定义为两字节?赶紧烧了,别留着误人子弟。c语言根本就没有规定一个整型占几个字节,是留给编译器实现的。因此,1字节(严重违规,但有的台系单片机就是那么随心所欲)、2字节、4字节、8字节的都有。印象中还有3字节的变态。
日常使用时,8位机、16位机一般是2字节,32位机、64位机一般是4字节。

出0入4汤圆

发表于 2016-12-24 12:34:28 | 显示全部楼层
takashiki 发表于 2016-12-24 07:21
你的哪本教科书c语言对整数定义为两字节?赶紧烧了,别留着误人子弟。c语言根本就没有规定一个整型占几个 ...

请推荐一本书

出0入93汤圆

发表于 2016-12-24 12:50:14 | 显示全部楼层

这个不用推荐吧,任何一个讲C语言的都会讲到这个问题。最权威的莫过于标准了,比如C99标准。

出0入8汤圆

发表于 2016-12-24 13:36:17 | 显示全部楼层

可以去看《C语言程序设计现代方法(第二版)》这个国外教材吧,
覆盖了 C99 标准。

出0入0汤圆

 楼主| 发表于 2016-12-24 14:35:24 | 显示全部楼层
takashiki 发表于 2016-12-24 07:21
你的哪本教科书c语言对整数定义为两字节?赶紧烧了,别留着误人子弟。c语言根本就没有规定一个整型占几个 ...

可能是误人子弟了。我给你三个版本的教材。




这是高教出版社第二版谭浩强教授


清华大学钱能主编。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入93汤圆

发表于 2016-12-24 15:47:14 | 显示全部楼层
gracialee 发表于 2016-12-24 14:35
可能是误人子弟了。我给你三个版本的教材。

如果您看的这三个版本针对特定的编译器和CPU架构,那这是由编译器实现了而不是C标准实现,那也无可厚非。
如果泛指所有的编译器和任意CPU架构,那这三个版本请自行扔到垃圾堆,请参考C89、C99标准。您所贴出的三个截图,不但int、long的表述是错误的,char的表述也是错误的。
我一直坚持我的观点,谭浩强的书,初学者可以看,应付考试那是相当有效;用来工作,那是害人害己。MISRA C中明令禁止的东西,里面比比皆是,何必呢。
也许谭的时代16位机是主流吧,可是现在都64位了。

要想看某一编译器int字节长度,可以打开他的<limits.h>,或者直接打印sizeof(int),比你到处翻箱倒柜找资料要强得多,难道真有郑人买履,宁信度无自信?
C标准规定int类型不能低于2个字节,长度上short<=int<=long<=long long,具体长度根本就没说,由编译器实现。至于1字节3字节的怪胎就不要去考虑了,也许人家为了效率考虑?就像Keil C51也不标准一样。

为了写出可移植性的程序,就不要使用什么int之类了,C99标准专门加入了两个头文件<stdint.h><stdbool.h>,这样写出来的程序都是可移植的。然而,大小端问题、位域顺序还是没法移植。

出0入0汤圆

发表于 2017-2-20 15:27:56 | 显示全部楼层
10000000用来表示-128似乎是人为定义的,因为原码无法表示-128,按正常程序更无法求得其补码。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 14:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表