Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: neutron_stz в May 27, 2014, 05:28



Титла: gcc bug ?
Публикувано от: neutron_stz в 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-то ли е ?


Титла: Re: gcc bug ?
Публикувано от: romeo_ninov в May 27, 2014, 06:32
На С е много опасно да ползвате такова сравнение за излизане от цикъл. И проверявали ли сте колко е int на вашата машина? Защото може да е само FFFF


Титла: Re: gcc bug ?
Публикувано от: gat3way в May 27, 2014, 08:42
Никакъв бъг не е в gcc, щом като искаш да ти се печата signed int, защо се учудваш от резултата? Aко не искаш да става така ползвай %u


Титла: Re: gcc bug ?
Публикувано от: neutron_stz в May 27, 2014, 11:01
На С е много опасно да ползвате такова сравнение за излизане от цикъл. И проверявали ли сте колко е int на вашата машина? Защото може да е само FFFF
Защо да е опасно ?
п.п. 32 бита е, не е 16

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


Титла: Re: gcc bug ?
Публикувано от: romeo_ninov в May 27, 2014, 11:17
На С е много опасно да ползвате такова сравнение за излизане от цикъл. И проверявали ли сте колко е int на вашата машина? Защото може да е само FFFF
Защо да е опасно ?
п.п. 32 бита е, не е 16

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


Титла: Re: gcc bug ?
Публикувано от: gat3way в May 27, 2014, 11:26
C99 ги решава тези неща със stdint.h. Лошото е че системните API-та не го ползват и много скоро пак опираш до стандартните типове. Най-грозно е с неща от сорта на size_t и off_t, като ги оплескаш става дискотека преминавайки от 32-битова система на 64-битова или обратното, в зависимост от случая.


Титла: Re: gcc bug ?
Публикувано от: romeo_ninov в 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);
...