Няшная / Говнокод #24499 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
#include <stdio.h>
#include <inttypes.h>
     
int main(void) {
  
	uint64_t a = 1<<31;
	uint64_t b = 1<<32;
	uint64_t c = (uint64_t)1<<32;
     
	printf("a:%llx\n", a);
	printf("b:%llx\n", b);
	printf("c:%llx\n", c);
     
	return 0;
}

a:ffffffff80000000
b:0
c:100000000

Занимался битоёбством и не сразу понял откуда в алгоритме мусор.

Запостил: govnokod3r govnokod3r, (Updated )

Комментарии (22) RSS

  • Компилятор решил, что справа 32-битное знаковое (int32_t), и в первом случае при преобразовании в unsigned большего размера расширил знак?
    Ответить
    • Да. По дефолту, целочисленные константы имеют тип signed int, вроде. Нужно либо суффикс ставить либо кастить в нужный тип.
      Ответить
  • Переведи на "PHP". Я не обязан знать твой древний язык для калькуляторов.
    Ответить
  • a) Справа число со знаком, конпелятор расширил его сохраняя знак (из-за этого и приписаны единички).
    б) Сдвиг 32-битного числа на 32 -- UB. Иногда получается 0, иногда число вообще никуда не двигается.
    ц) Ну тут всё норм.
    Ответить
  • выебал ваши биты за щеку, проверьте
    Ответить
  • uint64_t ? Тут явно проблема компиляторов, но GCC хоть предупредил:
    1.c: In function 'main':
    1.c:7:16: warning: left shift count >= width of type [-Wshift-count-overflow]
      uint64_t b = 1<<32;
                    ^
    Ответить

Добавить комментарий

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8