Автор Тема: gcc bug ?  (Прочетена 1978 пъти)

neutron_stz

  • Участници
  • ***
  • Публикации: 7
    • Профил
    • WWW
gcc bug ?
« -: May 27, 2014, 05:28 »
Тази сутрин докато си правих малоумни експерименти забелязах нещо необичайно. Значи, след като се компилира следния код с gcc - unsigned int си остава int.

Код:
#include <stdio.h>

unsigned int buffer;

int main(void)
{
for(;;)
{
printf("%d\n", buffer);

if(buffer == 0xFFFFFFFF)
break;

buffer++;
}

return 0;
}

Нещо bug с gcc-то ли е ?
« Последна редакция: May 27, 2014, 06:08 от neutron_stz »
Активен

Software is like sex: it's better when it's free!

romeo_ninov

  • Напреднали
  • *****
  • Публикации: 2155
    • Профил
Re: gcc bug ?
« Отговор #1 -: May 27, 2014, 06:32 »
На С е много опасно да ползвате такова сравнение за излизане от цикъл. И проверявали ли сте колко е int на вашата машина? Защото може да е само FFFF
Активен

0x2B|~0x2B

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: gcc bug ?
« Отговор #2 -: May 27, 2014, 08:42 »
Никакъв бъг не е в gcc, щом като искаш да ти се печата signed int, защо се учудваш от резултата? Aко не искаш да става така ползвай %u
Активен

"Knowledge is power" - France is Bacon

neutron_stz

  • Участници
  • ***
  • Публикации: 7
    • Профил
    • WWW
Re: gcc bug ?
« Отговор #3 -: May 27, 2014, 11:01 »
На С е много опасно да ползвате такова сравнение за излизане от цикъл. И проверявали ли сте колко е int на вашата машина? Защото може да е само FFFF
Защо да е опасно ?
п.п. 32 бита е, не е 16

Никакъв бъг не е в gcc, щом като искаш да ти се печата signed int, защо се учудваш от резултата? Aко не искаш да става така ползвай %u
Ахам, мерси :)
Активен

Software is like sex: it's better when it's free!

romeo_ninov

  • Напреднали
  • *****
  • Публикации: 2155
    • Профил
Re: gcc bug ?
« Отговор #4 -: May 27, 2014, 11:17 »
На С е много опасно да ползвате такова сравнение за излизане от цикъл. И проверявали ли сте колко е int на вашата машина? Защото може да е само FFFF
Защо да е опасно ?
п.п. 32 бита е, не е 16

Защото може никога да не стигнете границата. И по спомени ако сравнявате две цели числа по-малкото се конвертира до по-голямото и тогава се сравняват. Т.е. ако имате 0xFFFF и го сравнявате с 0xFFFFFFFF всъщност сравнявате 0x0000FFFF с 0xFFFFFFFF и се получава безкраен цикъл
Проверявате ли го в програмата дали е 16 или 32 битово? А ако пуснете програмата на друга платформа? Или разчитате на описания?
Активен

0x2B|~0x2B

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: gcc bug ?
« Отговор #5 -: May 27, 2014, 11:26 »
C99 ги решава тези неща със stdint.h. Лошото е че системните API-та не го ползват и много скоро пак опираш до стандартните типове. Най-грозно е с неща от сорта на size_t и off_t, като ги оплескаш става дискотека преминавайки от 32-битова система на 64-битова или обратното, в зависимост от случая.
Активен

"Knowledge is power" - France is Bacon

romeo_ninov

  • Напреднали
  • *****
  • Публикации: 2155
    • Профил
Re: gcc bug ?
« Отговор #6 -: May 27, 2014, 11:48 »
C99 ги решава тези неща със stdint.h. Лошото е че системните API-та не го ползват и много скоро пак опираш до стандартните типове. Най-грозно е с неща от сорта на size_t и off_t, като ги оплескаш става дискотека преминавайки от 32-битова система на 64-битова или обратното, в зависимост от случая.
Мдааа, нещо такова може да направи програмката малко по-надеждна
Код:
int j;
j = 1;
j <<= (sizeof(int)*8-1);
j = ~j;
printf("%u\n%d\n",j ,INT_MAX);
...
Активен

0x2B|~0x2B