C++中十进制和二进制的转换问题
我正在学习C++,书中有个对位进行操作的实例:charnum=-104;//二进制为10011000num>>=2;//结果为11100110(十进制-26)二进制的最左...
我正在学习C++,书中有个对位进行操作的实例:
char num = -104; // 二进制为 1001 1000
num >>= 2; // 结果为 1110 0110 (十进制-26)
二进制的最左边为符号位,那么-104的二进制应该是 1110 1000 啊(符号位+64+32+8),为什么是 1001 1000? 1001 1000 十进制不是(符号位+16+8)-24吗?而且很巧,这两个二进制数加起来正好是128。是说负数的表示方法与正数不同吗?
同样,右移后的 1110 0110 为什么为-26?
如果负数的二进制表示方法与正数不同的话,那么在负数的二进制与十进制互相转换中有什么换算的技巧吗?难道真的用128去求差?
多一个问题,既然C++中可以使用 unsigned 类型来表示无符号的数,那么对于同样的一个二进制数,计算机如何区分它的类型到底是 signed 还是 unsigned ?如何判断第一位是否为符号位? 展开
char num = -104; // 二进制为 1001 1000
num >>= 2; // 结果为 1110 0110 (十进制-26)
二进制的最左边为符号位,那么-104的二进制应该是 1110 1000 啊(符号位+64+32+8),为什么是 1001 1000? 1001 1000 十进制不是(符号位+16+8)-24吗?而且很巧,这两个二进制数加起来正好是128。是说负数的表示方法与正数不同吗?
同样,右移后的 1110 0110 为什么为-26?
如果负数的二进制表示方法与正数不同的话,那么在负数的二进制与十进制互相转换中有什么换算的技巧吗?难道真的用128去求差?
多一个问题,既然C++中可以使用 unsigned 类型来表示无符号的数,那么对于同样的一个二进制数,计算机如何区分它的类型到底是 signed 还是 unsigned ?如何判断第一位是否为符号位? 展开
3个回答
展开全部
负数是按照二进制补码的形式储存的
补码的把法就是绝对值对应的二进制码取反加一
24的二进制码是 0001 1000
取反是 1110 0111
加一 1110 1000 代表-24
那么 24 + (-24) 刚好就是 0000 0000, 如果到按无符号数来说和是256
这样的好处是正负数加加减法和无符号数的加减法规律一样
计算机在储存数据的时候是不分什么类型的
例如计算有符号数 24 + (-24) 和无符号数 24 + 232时
计算机cpu里面都是操作二进制的 0001 1000 + 1110 1000
8位结果显然都是 0000 0000
程序是人为地认为
在做符号数运算的时候是正负抵消结果为0,在做无符号数时是计算溢出
补码的把法就是绝对值对应的二进制码取反加一
24的二进制码是 0001 1000
取反是 1110 0111
加一 1110 1000 代表-24
那么 24 + (-24) 刚好就是 0000 0000, 如果到按无符号数来说和是256
这样的好处是正负数加加减法和无符号数的加减法规律一样
计算机在储存数据的时候是不分什么类型的
例如计算有符号数 24 + (-24) 和无符号数 24 + 232时
计算机cpu里面都是操作二进制的 0001 1000 + 1110 1000
8位结果显然都是 0000 0000
程序是人为地认为
在做符号数运算的时候是正负抵消结果为0,在做无符号数时是计算溢出
追问
按你的例子,-24的二进制码为24取反加一:
24 —— 0001 1000
-24 —— 1110 1000
那么 1110 1000 存储下来后,如果这个二进制数被调用,那如何判断它是一个补码(-24)还是一个无符号的正数(232)呢?
追答
那是程序判断的,不是机器判断的
从它是1110 1000到你看到-24或者232已经经过很多步的程序操作
但计算机分不清楚
例如你要计算有符号数的乘法的时候,你在程序中就写 a*b
但是实际机器中可能要有
根据两个数的符号判断结果的符号,取绝对值,相乘,根据符号判断结果要不要取补码
其实,如果你不是要用机器语言或者汇编语言,你不需要管机器怎样识别
你只要知道的编程语言例如c++是怎样定义有符号无符号就行了
C语言写一句,正真在机器中运行是可能要很多条指令才能完成
展开全部
Int类型占4个字节,所以-104在内存实际表示为:11111111 11111111 11111111 10011000
Char占一个字节,所以前面3个字节丢失,只接收到 10011000
一个负数转成二进制是求它的补码:求得它对应正数的二进制,按位取反再加1
要从一个二进制求对应的整数,一般会告诉你这是正数还是负数吧
最后一个问题,你存放一个数,不是第一件事就是定义它的类型吗,当然是根据你定义的类型来判断第一位是否是符号位
Char占一个字节,所以前面3个字节丢失,只接收到 10011000
一个负数转成二进制是求它的补码:求得它对应正数的二进制,按位取反再加1
要从一个二进制求对应的整数,一般会告诉你这是正数还是负数吧
最后一个问题,你存放一个数,不是第一件事就是定义它的类型吗,当然是根据你定义的类型来判断第一位是否是符号位
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
计算机 十进制和二进制的转换
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询