Какво се случва, ако изместим побитово цяло число повече от неговия размер

При компилиране на Visual Studio след C код, резултатът е 4.

void main() { int c = 1; c = c<<34;}

Кодът за сглобяване, както се вижда от прозореца за разглобяване на Visual Studio, е

shl eax,22h

От сглобяването е лесно да се види, че преместваме 34. Тъй като цялото число тук е 4 байта, от резултатите е очевидно, че модулната операция е извършена на ниво машина, за да направи това да работи като преместване с 2.

Чудех се дали това поведение е стандартизирано в различните платформи или варира в различните платформи?


person Manik Mahajan    schedule 20.04.2013    source източник
comment
Ами ако декларираме main като void main() {...}?   -  person wildplasser    schedule 20.04.2013
comment
под каква архитектура работите с програмата? i386 ?   -  person Lefteris E    schedule 20.04.2013
comment
това е x86-64, но моят windows е 32-битов.   -  person Manik Mahajan    schedule 20.04.2013
comment
@wildplasser с тези точки, това ще даде грешка при компилиране   -  person Manik Mahajan    schedule 20.04.2013


Отговори (2)


Случва се недефинирано поведение. Това е стандартизирано от езиковия стандарт (вижте раздел 6.5.7 Bitwise shift operators на C стандарта от 1999 г.). Наблюдаваните ефекти от UB обаче не са стандартизирани и могат да варират.

Що се отнася до shl eax, 22h, броячът на смяната ще бъде съкратен до 5 бита от процесора (вижте документацията) и тази инструкция наистина ще се държи като shl eax, 2.

person Alexey Frunze    schedule 20.04.2013
comment
Къде пише това за съкращаването? download.intel.com/products/processor/manual/325462.pdf - person Lefteris E; 20.04.2013
comment
@LefterisE Точно там, в Vol. 2B, раздел SAL/SAR/SHL/SHR—Shift: The count operand can be an immediate value or the CL register. The count is masked to 5 bits (or 6 bits if in 64-bit mode and REX.W is used). The count range is limited to 0 to 31 (or 63 if 64-bit mode and REX.W is used). Къде го търсихте и защо? - person Alexey Frunze; 20.04.2013
comment
Исках да потвърдя това, което казахте, за да гласувам за отговора ви - person Lefteris E; 21.04.2013

Според тази статия в MSDN:

Резултатът е недефиниран, ако десният операнд на израз за отместване е отрицателен или ако десният операнд е по-голям или равен на броя на битовете в (повишения) ляв операнд. Не се извършва операция за преместване, ако десният операнд е нула (0).

person Jonathan Wood    schedule 20.04.2013