Lun*_*din 73
右侧的负整数是C语言中未定义的行为.
ISO 9899:2011 6.5.7逐位移位运算符:
对每个操作数执行整数提升.结果的类型是提升的左操作数的类型.如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义.
Ana*_*and 16
正如其他成员已经回答的那样,它会产生未定义的行为.我想在这里提一下,你引用这本书("在一台机器上")似乎是偏袒的.它没有概括行为.该书也可能已经解释了该行为未按照标准定义.顺便说一句,我刚刚通过"新C标准 - 经济和文化评论"并发现了这一说法:
英特尔奔腾SAL指令(由gcc和Microsoft C++生成以评估左移)仅使用移位量的后五位
这很好地解释了为什么-5的左移可能导致左移27(对于负数的2的补码表示)
Oli*_*rth 11
行为未定义.
在5位二进制算术中,二进制补码-5具有与无符号+27相同的二进制表示,这可能解释了该特定平台.