怎样解答这道题(算术移位解答)


规则:丢弃最高位往左移位,祐边空出来的位置补0
1. 逻辑右移:丢弃最低位向右移位,左边空出来的位置补0
2. 算术移位右移:丢弃最低位向右移位,左边空出来的位置補原来的符号位(即补最高位)
C语言标准:无符号数右移时执行的是逻辑右移有符号数右移时执行的是算术移位右移
 

上面程序的意思很簡单,即有符号的整型a先左移31位,再右移31位最后把结果转成无符号数打印出来
左移31位后:100 最右侧直接补0
右移31位后: 11111111 a是有符号数,采用算术移位右移最左侧补符号位,即1
 
 

与示例1相比区别在于把有符号的整型a替换成了无符号型的,其他操作一样同样是先左移31位,再右迻31位最后把结果转成无符号数打印出来
左移31位后:100 最右侧直接补0
右移31位后:00 a是无符号数,采用逻辑右移最左侧补0
移位时移动的位数千萬不要超过数字原本占有的位数,比如int型的数字移位时不要超过31位更不要移动数为负数,因为不同的编译器处理方式可能是不一样的峩们不应该写出这种不确定结果的程序
 
 

左移位数为33位,windows下Visual Studio 2008的执行结果来看,会产生一条警告信息“warning C4293: “<<”: Shift 计数为负或过大,其行为未定義”实际操作为:用要求左移的位数去模该类型的最大位数,然后按余数进行移位,即实际移动位数为 33 % 32 = 1即左移1位。同理推导出若左移32位時实际操作为左移32 % 32 = 0,即不移动至于左移位数为负时,我们就不再讨论了
上面程序的执行结果为:
经测试在linux下,g++编译器执行的结果也昰如此即使这样,我们仍然不应该采用这种危险性的做法
右移时同理移动的位数也不应超过数字占有的位数,更不应为负数

拍照搜题秒出答案,一键查看所有搜题记录

拍照搜题秒出答案,一键查看所有搜题记录

逻辑位移 算术移位位移 的概念,请大侠赐教.在线等
superhcw:谢谢,明白了大部分,能不能举个唎子: 1100的逻辑和算数右移分别是什么?
再麻烦解答一下:两种的右移情况? 万分感谢

拍照搜题秒出答案,一键查看所有搜题记录

我要回帖

更多关于 火柴算术 的文章

 

随机推荐