社区
C语言
帖子详情
如何判断一个补码表示的是负数还是正数
swytcz201314
2010-04-06 09:49:05
例如 11111001
可以表示-7,好像也是正数的249
计算机是如何识别的?
...全文
2907
14
打赏
收藏
如何判断一个补码表示的是负数还是正数
例如 11111001 可以表示-7,好像也是正数的249 计算机是如何识别的?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
fairywell
2010-04-07
打赏
举报
回复
内部只有二进制补码,没有任何意义,可以是整数,可以使浮点,可以是一段视频编码,可以是一段音乐
怎么解释它是读取它的程序的事情,比如 printf 用 %d 修饰符,就会认为如果二进制最高位为 1 就是负数,否则正数。
星光伴月
2010-04-07
打赏
举报
回复
是数据类型决定了它所对应的数据所在的内存的二进制串所表示的意义。
上面是挺拗口的一句话,仔细看看想想就明白了,呵呵。
赵4老师
2010-04-06
打赏
举报
回复
计算机只负责计算0和1;
人来负责解释这个计算代表啥意思。
andychinajj
2010-04-06
打赏
举报
回复
类型很重要的哦
chistopher
2010-04-06
打赏
举报
回复
一定要指定类型
qzf368
2010-04-06
打赏
举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]
计算机不分正负,这个是要看你当成什么来用了。
[/Quote]
有道理!计算机才不管正负呢,只按二进制运算
xiuxianshen
2010-04-06
打赏
举报
回复
如果没有指定类型,估计计算机会出错的,呵呵
liao05050075
2010-04-06
打赏
举报
回复
这个要看你如何认定了。
如果定义为signed的话,那就是-7,如果定义为unsigned,那就是249
pengzhixi
2010-04-06
打赏
举报
回复
计算机不分正负,这个是要看你当成什么来用了。
a7182388
2010-04-06
打赏
举报
回复
计算机内部存储都是以1或0存储;
而最终的输出数据,是要看指令类型(数据的类型,比如int,unsigned,long,double等等);
就像你说的一样,上面的11111001,如果你不给系统该数据相应的解释指令的话,它是不知道该干什么的!!!
sanbailiushiliuye
2010-04-06
打赏
举报
回复
[Quote=引用 2 楼 liao05050075 的回复:]
这个要看你如何认定了。
如果定义为signed的话,那就是-7,如果定义为unsigned,那就是249
[/Quote]
顶
东大坡居士
2010-04-06
打赏
举报
回复
有符号位的第一位为符号位,无符号位的第一位也为表示具体的数字.
白云飘飘飘
2010-04-06
打赏
举报
回复
1
补码中正数最高位为0,负数最高位为1
kevinyujm
2010-04-06
打赏
举报
回复
1. 正负只有在你程序里面使用时才有实际意义,也就是逻辑上的意义,跟存储无关。
对于11111001,你的程序如果使用无符号数变量来存储,那说明你把它当249咯~
unsigned char a = 0xf9; //11111001 b
if (a < 0) //没意义
signed char b = 0xf9;
if (b < 0) //条件为真,b的确是负数
2. 计算机之所以采用补码的形式来存储数据,意义就在于使用补码后运算逻辑更简单,同时也决定了它在运算时无需区分正负。(编译软件在编译时会把所有数据都转化成2进制补码)
例如 -7+1=-6
11111001b + 00000001b = 11111010b
再如 7-1 = 6
00000111b + 11111111b = 00000110b
直接二进制位相加即可。
原码、反码都不能达到补码的效果。
正数
、
负数
和
补码
计算机中,
正数
、
负数
是怎么区分的呢,如何存放
正数
和
负数
?这里,就要用到
补码
这个概念了,先给出结论吧:
正数
和
负数
在计算机其实都是使用
补码
来存放的,并且在计算机中是没有减法运算的,减法实际上就是
补码
直接相加。
正数
和
负数
的
补码
补码
是计算机存放数据之前对数据做了一种转换操作得到的,与
补码
相关的几个名词还有原码、反码: 1、原码:字节的最高位为符号位,其余
表示
数值大小,最简单; 2、反码:
正数
的反码和原码一样,
负数
的反码除最高位符号位外,其他位都取反; 3、
补码
:在反码的基础上加1,这样可以方便计算机进行计算,可
计算机里的
正数
和
负数
为什么用
补码
表示
结论: 计算机里
正数
、
负数
都用
补码
表示
,方便
正数
和
负数
相加的计算; 同时,
正数
的原码、
补码
相同,因此都用
补码
表示
也不会影响
正数
和
正数
相加的情况; 原因: 若用原码
表示
的话,16 + (-8) = -24,显然错误 00010000 + (10001000) = 1001100 若用
补码
表示
的话,16 + (-8) = 8,正确 00010000 + (11111000) = 1(舍去)00001000 参考: http://www.ruanyifeng.com/blog/2009/08/twos_compl
为什么用
补码
表示
负数
, 为什么
负数
比
正数
多1?
(1)无符号16位的范围 0000 0000 0000 0000 到 1111 1111 1111 1111 无符号16位整型数据的取值范围是0到65535。 (2)有符号16位范围
正数
:0000 0000 0000 0001 到 0111 1111 1111 1111 十进制数为1到32767
负数
1000 0000 0000 0000 到1111 1111 1111 1111...
彻底弄清
补码
加减法运算,
正数
、
负数
位移运算原理
前言 所有的运算都是
补码
运算。
正数
的
补码
是其本身
负数
补码
的计算方式: 由原码到
补码
:原码除符号位以外全部取反得到反码,再加1得到
补码
。 由
补码
到原码:亦为除符号位以外取反加1,需注意,若
补码
为正,此时原码和其本身相等,无需取反加1,若不理解,请阅读下文加法例子。 例如(为方便清晰本文以 8bit 类型为例): -3 的原码:1000 0011 -3 的反码:1111 1100 -3 的
补码
:1111 1101 两个不同情况的加法例子: 例1:-3 + 2 2 的
补码
为其本身: 0000 0010
负数
为什么用
补码
表示
&
补码
定义
(转自 https://blog.csdn.net/leonliu06/article/details/78685197) 文首 我们都知道
负数
在计算机中是以
补码
(忘了
补码
定义的戳这里)
表示
的,那为什么呢?本文尝试了解
补码
的原理,而要想理解它,首先得理解算术中“模”的概念。所以首先看一下什么是模,然后通过
一个
小例子来理解
补码
。 1 符号位 C语言规定,把内存的最高位作为符号位,且用...
C语言
70,037
社区成员
243,246
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章