为什么1 << 31结果是负的,而(1<<31)-1结果却是正的呢?

邂逅的遗忘 2014-04-14 11:43:03
求各位大神,帮小弟解答。再此衷心表示感谢
...全文
607 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wang0635 2014-04-15
  • 打赏
  • 举报
回复
一般按补码解释,最左边一位是1就是负数,是0就是非负数
赵4老师 2014-04-15
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
如此美丽的你 2014-04-15
  • 打赏
  • 举报
回复 1
在32位的机器中,1<<31=0x80000000,作为有符号整数,其最高位为1表示负数,其值正好为32位有符号整数的最小值- 2,147,483,648。 (1<<31)-1在机器中计算时转换为2个数相加,即(1<<31)+(-1),其数学上的计算过程如下所示: 1000 0000 0000 0000 0000 0000 0000 0000 + 1111 1111 1111 1111 1111 1111 1111 1111 ------------------------------------------------------------ 1 0111 1111 1111 1111 1111 1111 1111 1111 显然计算结果超过了32位,最高位的1溢出被舍弃,最终机器中的结果为0x7fffffff,即32为有符号整数的最大值2,147,483,647
hw7be 2014-04-15
  • 打赏
  • 举报
回复 1
在32位的机器中,1<<31=0x80000000,作为有符号整数,其最高位为1表示负数,其值正好为32位有符号整数的最小值- 2,147,483,648。 (1<<31)-1在机器中计算时转换为2个数相加,即(1<<31)+(-1),其数学上的计算过程如下所示: 1000 0000 0000 0000 0000 0000 0000 0000 + 1111 1111 1111 1111 1111 1111 1111 1111 ------------------------------------------------------------ 1 0111 1111 1111 1111 1111 1111 1111 1111 显然计算结果超过了32位,最高位的1溢出被舍弃,最终机器中的结果为0x7fffffff,即32为有符号整数的最大值2,147,483,647

70,014

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧