Цитата(Royan @ 1.2.2006, 09:31 ) | Не могу понять, почему я не могу присвоить double число 1<<32? Я же не с интом работаю, и sizeof честно говорит 8 байт, в чем проблема? Система WinXP home (ясное дело win32) компилирую VS2003
|
Оно не заработает. 1<<32 - это ещё int, а не double. Решение
| Код | #include <iostream> using namespace std; int main() { double s = 1 << 32; cout << s << endl; //0
s = 1LL << 32; //(1) cout << s << endl; //4.29497e+09
s = 0x1p32; //(2) cout << s << endl;//4.29497e+09
}
|
способ (2) имхо предпочтительнее. 0x1p32 это уже float constant. а 1LL <<32 это ещё integer constant. Добавлено @ 08:14 (0x1p32 это 1 * 2 ** 32 - это вообще фича c99, поэтому с++ компилятор может её не держать(комо в с++ стрикт не держит, в с99 держит, gnu c держит, как обстоят с этим делом дела у msvc не знаю. Но если 0x1p32 в нём есть, то это одназначно то, что нужно)). Добавлено @ 08:18 (только long long (1LL) он тоже не стандартен строго говоря. Если 1LL вызывает ошибку, то можно что-то типа __int64(1) << 32, или __i64(1) << 32. Вообщем shift'ить нужно 64 и более битовое число) Добавлено @ 08:20
Цитата(chaos @ 1.2.2006, 11:32 ) | и интересно почему твой компилер не дал тебе по рукам
|
Он максимум что warning выдаст. Comeau: "ComeauTest.c", line 1: warning: shift count is too large GCC: a.cpp:7: warning: left shift count >= width of type |