Предупреждение: у нас есть цензура и предварительный отбор публикуемых материалов. Анекдоты здесь бывают... какие угодно. Если вам это не нравится, пожалуйста, покиньте сайт. 18+

Анекдот №-10059266

Идет Илья Муромец по полю. Видит - Змей Горыныч сидит. Ну, тот подкрался
к нему и срубил ему голову. У Змея Горыныча две выросло. Срубил Илья ему
две - четыре выросло! Срубил четыре - выросло восемь!!! И так далее... И
вот когда Илья Муромец срубил 65535 голов, Змей Горыныч помер... Потому
что был он 16-ти битным.
+318
Проголосовало за – 467, против – 149
Статистика голосований по странам
Статистика голосований пользователей
Чтобы оставить комментарии, необходимо авторизоваться. За оскорбления и спам - бан.
13 комментариев, показывать
сначала новые

tlittle02.04.19 09:44

Эххх... 2001 год, вроде в интернетах ещё грамотные люди сидели... Чтобы 16-битный змей умер - у него надо срубить 32768 голов. А 65535 у него вообще быть не может - это же змей :)

+0
ответить

zavbaz➦tlittle28.04.24 11:43

эээх 2019 год. А люди какие были такие и остались!
Диапазон целочисленных значений , которые могут храниться в 16 битах, зависит от используемого целочисленного представления. Для двух наиболее распространенных представлений диапазон составляет
1 от 0 до 65 535 (2 в 16 степени минус 1) для представления в виде беззнакового двоичного числа.
2 от −32768 (-1 умножить 2 в 15 степени) до 32767 (2 в 15 степени МИНУС 1) при представлении отрицательных целых чисел.
Заметьте +32767 а не +32768! Видимо типичная ошибка ламера который забывает что считают с 0! А 0 рубить никак!

+1
ответить

zavbaz28.04.24 23:09

(Большинство) реализаций C++ (и не только C) предоставляют по крайней мере 8, 16, 32 и 64-битные знаковые и беззнаковые целочисленные типы. И как раз В случае беззнаковыми целочисленными 65535 в 16 бит прекрасно укладываются.
Использование беззнаковых целочисленных типов в C++ — дело, мягко говоря, спорное. «За» такой подход возможность выразить в системе типов тот факт, что некоторая сущность не может быть отрицательной. Аргументом «против» является тот факт, что вычитание легко приводит к возникновению больших значений из-за целочисленного переполнения при нуле.

+0
ответить

zavbaz29.04.24 20:20

даже уже не знаю как ткнуть пальцем https://ru.stackoverflow.com/questions/1152230/%D0%9D%D0%B5-%D0%BF%D0%BE%D0%BD%D0%B8%D0%BC%D0%B0%D1%8E-%D1%80%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D1%83-%D0%BC%D0%B5%D0%B6%D0%B4%D1%83-signed-unsigned

unsigned int a = 65535
Число 65 535 в двоичной системе счисления представлено как 1111 1111 1111 1111. 65 535 — это наибольшее число, которое может хранить 2-байтовая (16 бит) целочисленная переменная без знака, так как это число использует все 16 бит.

+0
ответить

zavbaz29.04.24 20:55

ну или так если русским буковкам не доверяете https://eel.is/c++draft/basic.fundamental#2

+0
ответить

zavbaz30.04.24 22:09

ну детский сад же
Переполнение беззнакового целого числа четко определено стандартами C и C++. Например, стандарт C99
Вычисление, включающее беззнаковые операнды, никогда не может привести к переполнению, поскольку результат, который не может быть представлен результирующим целочисленным типом без знака, уменьшается по модулю числа, которое на единицу больше, чем наибольшее значение, которое может быть представлено результирующим типом.
Поэтому максимальное значение 16-bit unsigned int 65535
если unsigned int16 переменной присвоить значени 32768 и умножить на 2 по вы получите оппа 65535 а вовсе 65536

+0
ответить

zavbaz➦zavbaz30.04.24 22:09

а вовсе не 65536

+0
ответить

zavbaz30.04.24 23:07

ляяяяяяяяяяяя про неявное преобразование типов ты явно не слышал
Вопрос в том какие типы данных получаются в результате преобразований в разных случаях:
char+int
char+float
char+double
int+float
int+double
char+unsigned char
!!!!!!!!!!!!!!!!! int+unsigned int !!!!!!!!!!!!!!!!!!!!!!
float+unsigned float
вот тут оно у тебя и происхот i = i*2;
:))) говорил же детский сад.

+0
ответить

zavbaz➦zavbaz30.04.24 23:10

Если один из операндов имеет тип long double, то и второй операнд приводится к типу long double
В противном случае, если один из операндов имеет тип double, то и второй операнд приводится к типу double
В противном случае, если один из операндов имеет тип float, то и второй операнд приводится к типу float
В противном случае оба операнда подвергаются integer promotions1 и далее рассматриваются типы после promotions

Если оба операнда имеют одинаковый тип, ничего делать не надо
В противном случае, если оба операнда имеют знаковый тип или оба операнда имеют беззнаковый тип, то операнд с меньшим рангом конвертируется к типу операнда с большим рангом
В противном случае, если один операнд имеет беззнаковый тип и ранг, который выше или равен рангу второго операнда, то знаковый операнд конвертируется к типу беззнакового операнда
В противном случае, если диапазон значений знакового операнда достаточен для представления всех значений беззнакового операнда, то беззнаковый операнд конвертируется к типу знакового операнда
В противном случае, оба операнда конвертируются к беззнаковому типу, соответствующему типу знакового операнда

Integer promotions - преобразования "малых" целых типов _Bool, [signed/unsigned] char, [signed/unsigned] short к типу int (если диапазон int достаточен)

+0
ответить

zavbaz30.04.24 23:16

А ты чел похож на человека который умеет пользоваться молотком (ну как умеет - иногда попадает по гвоздю если хорошо прицелится) но при этом пытается использовать молоток во всех случаях не задумываясь что может быть очень больно. И не задумывается из чего сделан молоток какие собственно силы участвуют в работе и тд.

+0
ответить

zavbaz30.04.24 23:41

"собрал и запустил" угу в онлайн компиляторе он собрал :) без привязке к платформе (ЗМЕЙ)
а чтобы оно вообще правильно работало должно то быть не так как у тебя О ЧЁМ СОБСТВЕННО и шутка
а так
{
unsigned z = 0;
unsigned short i = 32768;
z = i*2;
std::cout<<z;
return 0;
};

и резуьтат будет честные 65536

+0
ответить

zavbaz30.04.24 23:55

{
unsigned short x = 65535; // наибольшее значение, которое может хранить 16-битная unsigned переменная
std::cout << "x was: " << x << std::endl;
x = x + 1; // 65536 - это число больше максимально допустимого числа из диапазона допустимых значений. Следовательно, произойдёт переполнение, так как переменнная x не может хранить 17 бит
std::cout << "x is now: " << x << std::endl; 0;
}
x was: 65535
x is now: 0
на что вы и упираете ЗАБЫВ о том что результат то вы получили неправильный с точки зрения змея а правильный с точки зрения компилятора. Вот в этом то и весь юмор.

+0
ответить

zavbaz01.05.24 00:38

а чем собственно сложение от умножения отличается если результат одинаковый - переполнение.
Я тебе не меньше раз объяснял но ты всё ещё упираешся рогом твоей право.
stackoverflow.com/questions/75325356/what-is-the-algorithm-that-a-compiler-would-use-while-casting-signed-variables-t

я
Поэтому максимальное значение 16-bit unsigned int 65535
если unsigned int16 переменной присвоить значени 32768 и умножить на 2 по вы получите оппа 65535
вы
Т.е., для 16-битного unsgined int максимальное число - 65535, на единицу больше - 65536, уменьшаем по модулю и получаем. Па-па-ра-рам... "0"...

только вот по "моей" логике ошибка составляет 1
а вот по "вашей" (комплилятора) ошибка составляет 65536
С 0 головами дракон дохнет.

И кто тут кретин?
И в 33 раз говорю учитесь писать так чтобы переполнения не было. О ЧЁМ И АНЕКДОТ.

Про "заведовать базой" - переход на личности это конечно великого ума поступок. При этом не зная откуда вообще взялся ник. Если что ни к военным ни к овощным ни к каким-либо прочим существующем в реальном мире базам ник не имеет отношения :)
А вот к base() имеет
:)

+0
ответить

Общий рейтинг комментаторов
Рейтинг стоп-листов

Рейтинг@Mail.ru