The OpenNET Project / Index page

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



Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Компиляция)
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

htons(), gcc и типы :-/ нефкурю...  , pavlinux (ok), 08-Окт-09, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


1. "htons(), gcc и типы :-/ нефкурю...  "  +/
Сообщение от аноним (?), 08-Окт-09, 17:49 
Спрашивайте в maillist'ах gcc. Это проявляется только с -Ox и не проявляется на любых версиях gcc на FreeBSD.
Ответить | Правка | Наверх | Cообщить модератору

2. "htons(), gcc и типы :-/ нефкурю...  "  +/
Сообщение от pavlinux (ok), 09-Окт-09, 00:03 
>Спрашивайте в maillist'ах gcc. Это проявляется только с -Ox и не проявляется
>на любых версиях gcc на FreeBSD.

Ну вообще-то не просто -Ox виновата, а -Wconversion с -O2 или -O3


В мане белым по чёрному написано

-Wconversion
  Warn for implicit conversions that may alter a value. This includes conversions between
real and integer, like "abs (x)" when "x" is "double"; conversions between signed and
unsigned, like "unsigned ui = -1"; and conversions to smaller types, like "sqrtf (M_PI)".
  Do not warn for explicit casts like "abs ((int) x)" and "ui = (unsigned) -1", or if the
value is not changed by the conversion like in "abs (2.0)".  Warnings about conversions
between signed and unsigned integers can be disabled by using -Wno-sign-conversion.


У меня случай преобразования (unsigned short int) -> (unsigned int)
То есть - знака с обеих сторон нет, из меньшего в большее...

Ответить | Правка | Наверх | Cообщить модератору

3. "htons(), gcc и типы :-/ нефкурю...  "  +/
Сообщение от pavlinux (ok), 09-Окт-09, 03:09 
>Спрашивайте в maillist'ах gcc. Это проявляется только с -Ox и не проявляется
>на любых версиях gcc на FreeBSD.

Нашёл откуда ноги растут

int main() {

        unsigned short int x, y;

        x = y << 8;

return 0;
}


# gcc -O0 -Wconversion test.c
# ./a.out

Как говорит ISO/IEC 9899:201x,  стр. 85., §6.5.7  Bitwise shift operators

> 2. Each of the operands shall have integer type.  

Вот и орёт.
А дальше ещё интереснее...

> 3. The integer promotions are performed on each of the operands.
> The type of the result is that of the promoted left operand.  

А у меня левый unsigned short :)
> If the value of the right operand is negative or is greater
>than or equal to the width of the promoted left operand, the behavior is undefined.

Ответить | Правка | К родителю #1 | Наверх | Cообщить модератору

4. "htons(), gcc и типы :-/ нефкурю...  "  +/
Сообщение от gpl77 (ok), 09-Окт-09, 10:25 
>[оверквотинг удален]
>int main() {
>
>        unsigned short int x,
>y;
>
>        x = y <<
>8;
>
>return 0;
>}

во freebsd i386
htons это __byte_swap_word и аргумент до int нигде по дороге не расширяется

Ответить | Правка | Наверх | Cообщить модератору

5. "htons(), gcc и типы :-/ нефкурю...  "  +/
Сообщение от pavlinux (ok), 09-Окт-09, 16:54 
>>[оверквотинг удален]
>>int main() {
>>
>>  unsigned short int x, y;
>>   x = y << 8;
>>return 0;
>>}
>
>во freebsd i386 htons это __byte_swap_word
> и аргумент до int нигде по дороге не расширяется

При -O0 это

extern uint16_t htons (uint16_t __hostshort);

но при -O2 и более это тоже макрось __swap_16(x), и далее  __bswap_constant_16(__x)

<in.h>

#ifdef __OPTIMIZE__

# if __BYTE_ORDER == __BIG_ENDIAN
...
# define htons(x)    (x)
# else
#  if __BYTE_ORDER == __LITTLE_ENDIAN
...
#   define htohs(x)    __bswap_16 (x)

в <bits/byteswap.h>

/* Swap bytes in 16 bit value.  */

#define __bswap_constant_16(x) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))

# define __bswap_16(x) \
     (__extension__                                                           \
      ({ register unsigned short int __v, __x = (x);                          \
         if (__builtin_constant_p (__x))                                      \
           __v = __bswap_constant_16 (__x);                                   \
         else                                                                 \
           __asm__ ("rorw $8, %w0"                                            \
                    : "=r" (__v)                                              \
                    : "0" (__x)                                               \
                    : "cc");                                                  \
         __v; }))


if (__builtin_constant_p (__x))  

Где живёт __builtin_constant_p не нашёл

-fno-builtn не помогает, чтоб до asm дошло дело.

Ответить | Правка | Наверх | Cообщить модератору

6. "htons(), gcc и типы :-/ нефкурю...  "  +/
Сообщение от const86 (ok), 10-Окт-09, 00:20 
>Где живёт __builtin_constant_p не нашёл

Дык оно ж builtin, живёт в голове комплятора и ни в каком хедере не описано ;)

Ответить | Правка | Наверх | Cообщить модератору

7. "htons(), gcc и типы :-/ нефкурю...  "  +/
Сообщение от pavlinux (ok), 10-Окт-09, 01:47 
>>Где живёт __builtin_constant_p не нашёл
>
>Дык оно ж builtin, живёт в голове комплятора и ни в каком
>хедере не описано ;)

Это понятно, смысл работы искал... нашел...


__builtin_constant_p (x) - возвращает 1 если х константа и 0 если нет.

Дальше ещё веселее

Возвращение 0 не означает, что значение не является постоянным,
а лишь то, что GCC не может доказать, что она постоянно с указанным
значением опции -O.

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

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




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

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