社区
C语言
帖子详情
为什么1 << 31结果是负的,而(1<<31)-1结果却是正的呢?
邂逅的遗忘
2014-04-14 11:43:03
求各位大神,帮小弟解答。再此衷心表示感谢
...全文
607
4
打赏
收藏
为什么1 << 31结果是负的,而(1<<31)-1结果却是正的呢?
求各位大神,帮小弟解答。再此衷心表示感谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
关于Java中 1 左移
31
返回值为
负
数,int 范围等问题
问题: 移位运算符在java中的使用是十分快捷的,运算速度远远超过乘法运算 在使用<<运算符时,发现如下问题: 1<<
31
的返回值是
负
数 具体值为-2
31
解答: int是一个32位的符号数,其中第一位代表符号位,当第一位为0时,表示
正
数,而第一位为1时,表示
负
数。 当1<<
31
时,第一位符号位被置为1 。因此返回
负
数。 注意事项: 在java中,i...
c语言1左移32位(1<<32)是多少,左移-1位呢
C语言中 << 是逻辑移位,不是循环移位。1 左移 32 位后为 0,左移 -1 位实际是左移 255 位(互补),当然也是0。这种问题可以写一段小程序,单步执行,看一下每一步的结果。先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例如: int i = 1; i = i << 2; //把i里的值左移2位 也就是说,1的2进制...
C90标准中无符号数与有符号数的比较以及原因解释(关系式-2147483648<2147483647结果为假)
可以看到如上结果,第一个结果看起来非常不符合常识为什么得到的结果是0即false,而对 i 赋值,在进行的比较运算得到的结果
却是
1即true呢? 在C90标准下,编译器在处理常量时,会按照的顺序确定数据类型,为32位带符号整数,位32为无符号整型,为64位带符号整型,为64位无符号整型。
探究HashMap源码中最大容量为什么是2的30次方(1<<30)?
在阅读hashmap的源码过程中,我看到了关于hashmap最大容量的限制,并产生了一丝疑问。 为啥最大容量是 1
[面试题]是否存在 i+1 小于 i 的值呢?
答案:是存在的。为什么呢? 因为在java中整型值是有范围的,它的最大值为2^
31
-1,也就是2147483647,最小值是-2^
31
-1,也就是-2147483648。 当对最大值进行+1时,就变成2147483648(越界了),就溢出了,那么此值为多少呢?结果是-2147483648,即为Integer.MIN_VALUE,所以就有了Integer.MAX_VALUE + 1=Integer...
C语言
70,014
社区成员
243,263
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章