The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Не понимаю ..."
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Не понимаю ..."
Сообщение от Alexander Искать по авторуВ закладки on 17-Сен-03, 13:43  (MSK)
Столкнулся с подобной ерундой:
На FreeBSD 4.8R (родной компилятор) следующий код:

#include <stdio.h>

int main() {
unsigned long addr=4000000000LU;
unsigned char mask=0;

printf ("%lu\n",addr&(0xffffffff<<(32-mask)));
}

дает результат: 4000000000 (что не правильно!), если в printf'е поставить руками 0:

#include <stdio.h>

int main() {
unsigned long addr=4000000000LU;
unsigned char mask=0;

printf ("%lu\n",addr&(0xffffffff<<(32-0)));
}

,то результат: 0

Turbo C 2.0 досовский правильно справляется с этой ситуацией.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Не понимаю ..."
Сообщение от SergeiZz Искать по авторуВ закладки on 18-Сен-03, 13:09  (MSK)
> unsigned long addr=4000000000LU;
> unsigned char mask=0;
>
> printf ("%lu\n",addr&(0xffffffff<<(32-0)));
>,то результат: 0
Не должно быть результата вовсе.
Оператор сдвига 0xffffffff << 32 не корректен.
0xffffffff можно сдвинуть только на 31 бит, но не дальше.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Не понимаю ..."
Сообщение от aka50 Искать по авторуВ закладки on 23-Сен-03, 17:01  (MSK)
>> unsigned long addr=4000000000LU;
>> unsigned char mask=0;
>>
>> printf ("%lu\n",addr&(0xffffffff<<(32-0)));
>>,то результат: 0
>Не должно быть результата вовсе.
>Оператор сдвига 0xffffffff << 32 не корректен.
>0xffffffff можно сдвинуть только на 31 бит, но не дальше.


printf ("%lu\n",addr & (((u_int64_t)0xffffffff) << (32-0)));
тогда сдвинется

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Не понимаю ..."
Сообщение от qq Искать по авторуВ закладки on 23-Сен-03, 20:38  (MSK)
>Столкнулся с подобной ерундой:
>На FreeBSD 4.8R (родной компилятор) следующий код:
>
>#include <stdio.h>
>
>int main() {
> unsigned long addr=4000000000LU;
> unsigned char mask=0;
>
> printf ("%lu\n",addr&(0xffffffff<<(32-mask)));
>}
>
>дает результат: 4000000000 (что не правильно!), если в printf'е поставить руками 0:
>
>
>#include <stdio.h>
>
>int main() {
> unsigned long addr=4000000000LU;
> unsigned char mask=0;
>
> printf ("%lu\n",addr&(0xffffffff<<(32-0)));
>}
>
>,то результат: 0
>
>Turbo C 2.0 досовский правильно справляется с этой ситуацией.


в первом случае компилятором генерируется команда shl, которая сдвигает регистр eax на 32 бита вправо
но начиная с 286 проца эта команда использует только 5 младших битов счетчика, остальные игнорируются
так что для процессора это все равно что сдвигать на 0 бит

во втором случае, так как в скобках стоит константа, компилятор видит проблему, дайт warning, и подставляет просто 0 в качестве результата, вообще ничего не высчитывая

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру