Эххх... 2001 год, вроде в интернетах ещё грамотные люди сидели... Чтобы 16-битный змей умер - у него надо срубить 32768 голов. А 65535 у него вообще быть не может - это же змей :)
zavbaz➦tlittle• 28.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 рубить никак!
(Большинство) реализаций C++ (и не только C) предоставляют по крайней мере 8, 16, 32 и 64-битные знаковые и беззнаковые целочисленные типы. И как раз В случае беззнаковыми целочисленными 65535 в 16 бит прекрасно укладываются.
Использование беззнаковых целочисленных типов в C++ — дело, мягко говоря, спорное. «За» такой подход возможность выразить в системе типов тот факт, что некоторая сущность не может быть отрицательной. Аргументом «против» является тот факт, что вычитание легко приводит к возникновению больших значений из-за целочисленного переполнения при нуле.
даже уже не знаю как ткнуть пальцем 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 бит.
ну или так если русским буковкам не доверяете https://eel.is/c++draft/basic.fundamental#2
ну детский сад же
Переполнение беззнакового целого числа четко определено стандартами C и C++. Например, стандарт C99
Вычисление, включающее беззнаковые операнды, никогда не может привести к переполнению, поскольку результат, который не может быть представлен результирующим целочисленным типом без знака, уменьшается по модулю числа, которое на единицу больше, чем наибольшее значение, которое может быть представлено результирующим типом.
Поэтому максимальное значение 16-bit unsigned int 65535
если unsigned int16 переменной присвоить значени 32768 и умножить на 2 по вы получите оппа 65535 а вовсе 65536
ляяяяяяяяяяяя про неявное преобразование типов ты явно не слышал
Вопрос в том какие типы данных получаются в результате преобразований в разных случаях:
char+int
char+float
char+double
int+float
int+double
char+unsigned char
!!!!!!!!!!!!!!!!! int+unsigned int !!!!!!!!!!!!!!!!!!!!!!
float+unsigned float
вот тут оно у тебя и происхот i = i*2;
:))) говорил же детский сад.
Если один из операндов имеет тип long double, то и второй операнд приводится к типу long double
В противном случае, если один из операндов имеет тип double, то и второй операнд приводится к типу double
В противном случае, если один из операндов имеет тип float, то и второй операнд приводится к типу float
В противном случае оба операнда подвергаются integer promotions1 и далее рассматриваются типы после promotions
Если оба операнда имеют одинаковый тип, ничего делать не надо
В противном случае, если оба операнда имеют знаковый тип или оба операнда имеют беззнаковый тип, то операнд с меньшим рангом конвертируется к типу операнда с большим рангом
В противном случае, если один операнд имеет беззнаковый тип и ранг, который выше или равен рангу второго операнда, то знаковый операнд конвертируется к типу беззнакового операнда
В противном случае, если диапазон значений знакового операнда достаточен для представления всех значений беззнакового операнда, то беззнаковый операнд конвертируется к типу знакового операнда
В противном случае, оба операнда конвертируются к беззнаковому типу, соответствующему типу знакового операнда
Integer promotions - преобразования "малых" целых типов _Bool, [signed/unsigned] char, [signed/unsigned] short к типу int (если диапазон int достаточен)
А ты чел похож на человека который умеет пользоваться молотком (ну как умеет - иногда попадает по гвоздю если хорошо прицелится) но при этом пытается использовать молоток во всех случаях не задумываясь что может быть очень больно. И не задумывается из чего сделан молоток какие собственно силы участвуют в работе и тд.
"собрал и запустил" угу в онлайн компиляторе он собрал :) без привязке к платформе (ЗМЕЙ)
а чтобы оно вообще правильно работало должно то быть не так как у тебя О ЧЁМ СОБСТВЕННО и шутка
а так
{
unsigned z = 0;
unsigned short i = 32768;
z = i*2;
std::cout<<z;
return 0;
};
и резуьтат будет честные 65536
{
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
на что вы и упираете ЗАБЫВ о том что результат то вы получили неправильный с точки зрения змея а правильный с точки зрения компилятора. Вот в этом то и весь юмор.
а чем собственно сложение от умножения отличается если результат одинаковый - переполнение.
Я тебе не меньше раз объяснял но ты всё ещё упираешся рогом твоей право.
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() имеет
:)