Как может опасно влиять буква L при вычислениях?

Тема в разделе "LANGS.C", создана пользователем NoName, 31 авг 2011.

  1. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Как может опасно на операции влиять буква L при оперировании большими числами? Например двордами?
    В случаях когда её нет и она должна быть или наобарот.
     
  2. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    может опасно влиять, например на переносимость:
    если в каком-нибудь системе -1 это int и на этой системе int!=long
    тогда
    unsigned long a = -1 будет вовсе не все биты 1 а что-то другое...
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    h0t

    Разве unsigned long a = -1 не даст варнинга?
     
  4. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Так вопрос же не в этом был, вопрос был на счет в чем опасность L)

    P.S. unsigned long a = -1UL

    будет то что надо)

    Т.е. эти буквы указывают тип константы, и смысл такой же как и при неявном преобразовании.

    P.S.1. Кстати у меня warning не сыпет.... (GCC и VS)
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Ну тогда конкретно L тут ничем особо не выделяется - нужно всегда следить за тем, чтобы не было неявных преобразований из литеров. Это касается и L, и U, и LL, и всего остального.
     
  6. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Допустим в коде написано:
    Код (Text):
    1. unsigned long test;
    2. test = 0x12345678;
    3. test = 0x12345678L;
    4. test = 0x12345678UL;
    Как этим правильно пользоваться? Какие ошибки могут быть на почве неправильного использования?
    Зачем в си такие сложности?
     
  7. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    В этом примере в принципе ничего плохого не будет, теоретически если у Вас попадется система на которой long не 4 байта МОГУТ быть проблемы. Хотя такого рода вещи скорее ,например, с отрицательными числами как в моем примере важны.

    Сложности такие для типизации констант т.е. у константы получается заданный тип. (вернее не константы а литералы)
     
  8. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Если написать без литеры не сочтет ли компилятор её за int?
     
  9. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    сочтет, но так-как на x86 системах long = int то ничего страшного не будет, а вот в других системах будет плохо...
     
  10. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    NoName
    Компилятор читает константу как int, если константа в int не лезет, то он её туда впихивает обрезая лишние биты. gcc, правда, научился этого не делать, но может быть только на x86_64. Но когда он этого не делал, он ругался варнингами, так что всех негативных эффектов легко было избежать компилируя с -Wall и просматривая вывод компилятора.
     
  11. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Даже MS VC ругается на это)
     
  12. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Borland для DOS похоже нет.
     
  13. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Возможно дело в глубине ворнингов.

    P.S. Вы любитель антиквариата)
     
  14. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    h0t
    Да я ж не отрицаю. Я говорю с привязкой к gcc, поскольку стандартов не помню, а другими компиляторами не пользуюсь.
     
  15. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Не подумате ничего плохого, это я с тем контекстом, что проверил на VS и даже на нем работает, как на не самом аддекватном компиляторе..