2013-12-16 2 views
2

У меня есть следующий код в Ruby.Сдвиг левого бита на 16 в Ruby и C++

x = 33078 
x << 16 
# => 2167799808 

В C++ этот код

int x = 33078; 
x << 16 
# => -2127167488 

Я знаю, что это связано с переполнением, но как я могу получить C++, чтобы дать тот же результат, как Ruby?

+0

Использовать 'long int' – iamnotmaynard

+3

На самом деле, более безопасно использовать' long long' вместо этого. –

+0

Еще лучше использовать неподписанный тип. – jrok

ответ

5

33078 << 16 не вписывается в целое число, поэтому в C++ он переполняется и получает отрицательное значение. Между тем в рубине тип автоматически преобразуется в нечто достаточно большое, чтобы сохранить результат этого вычисления.

Если вы хотите вычислить это значение в C++, используйте тип с более высоким максимальным значением. unsigned int будет достаточно в этом случае, но если вы хотите вычислить большие значения, вам может понадобиться long long или даже unsigned long long.

0

Вам нужно использовать целое число, размер одного байта как Ruby int.

pry(main)> x = 33078 
=> 33078 
pry(main)> x.size 
=> 8 

Попробуйте

long int x 

Вообще Int не в C являются 32-битными, а не 64-битной (или 8 байт).

0
#include <iostream> 

int main() 
{ 
    uint64_t x= 33078; 
    std::cout<< (x<< 16); 
} 

$ g++ -std=c++11 test.cpp && ./a.out 
$ 2167799808 
Смежные вопросы