KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I recently faced a strange behavior using the right-shift operator. The following program: #include <cstdio> #include <cstdlib> #include <iostream> #include <stdint.h> int foo(int a, int b) { return a >> b; } int bar(uint64_t a, int b) { return a >> b; } int main(int argc, char** argv) { std::cout << "foo(1, 32): " << foo(1, 32) << std::endl; std::cout << "bar(1, 32): " << bar(1, 32) << std::endl; std::cout << "1 >> 32: " << (1 >> 32) << std::endl; //warning here std::cout << "(int)1 >> (int)32: " << ((int)1 >> (int)32) << std::endl; //warning here return EXIT_SUCCESS; } Outputs: foo(1, 32): 1 // Should be 0 (but I guess I'm missing something) bar(1, 32): 0 1 >> 32: 0 (int)1 >> (int)32: 0 What happens with the foo() function ? I understand that the only difference between what it does and the last 2 lines, is that the last two lines are evaluated at compile time. And why does it "work" if I use a 64 bits integer ? Any lights regarding this will be greatly appreciated ! Surely related, here is what g++ gives: > g++ -o test test.cpp test.cpp: In function 'int main(int, char**)': test.cpp:20:36: warning: right shift count >= width of type test.cpp:21:56: warning: right shift count >= width of type
Tags (comma-separated)
Save Edits
Cancel