Жахливі відповіді Галор
Ozgur Ozcitak
Якщо ви переходите від підписаного до непідписаного (і навпаки), внутрішнє представлення номера не змінюється. Що змінюється, як компілятор інтерпретує біт знаків.
Це абсолютно неправильно.
Матс Фредрікссон
Якщо додана одна неподписана та одна підписана змінна (або будь-яка двійкова операція), обидві неявно перетворюються на неподписані, що в цьому випадку призведе до величезного результату.
Це теж неправильно. Непідписані вкладиші можуть бути переведені в ints, якщо вони мають однакову точність через біт підкладки в неподписаному типі.
смх
Ваша операція додавання спричиняє перетворення int на безпідписаний int.
Неправильно. Можливо, так і може, ні.
Перетворення з непідписаного int до підписаного int залежить від реалізації. (Але це, мабуть, працює так, як ви очікуєте на більшості платформ сьогодні.)
Неправильно. Це або невизначена поведінка, якщо вона викликає переповнення, або значення зберігається.
Анонімний
Значення i перетворюється на непідписаний int ...
Неправильно. Залежить від точності int щодо непідписаного int.
Тейлор Прайс
Як було сказано раніше, ви можете без проблем переходити між підписаними та неподписаними.
Неправильно. Спроба зберігати значення поза діапазоном підписаного цілого числа призводить до невизначеної поведінки.
Тепер я можу нарешті відповісти на питання.
Якщо точність int дорівнює неподписаному int, u буде підвищено до підписаного int, і ви отримаєте значення -4444 з виразу (u + i). Тепер, якщо у і у мене є інші значення, ви можете отримати переповнення та невизначене поведінку, але при таких точних числах ви отримаєте -4444 [1] . Це значення матиме тип int. Але ви намагаєтесь зберегти це значення в безпідписаний int, щоб потім було передано неподписаний int, і значення, яке отримає результат, було б (UINT_MAX + 1) - 4444.
Якщо точність неподписаного int буде більшою, ніж у int, підписаний int буде підвищений до непідписаного int, що дасть значення (UINT_MAX + 1) - 5678, яке буде додано до іншого безпідписаного int 1234. Якщо u і я маю з інших значень, за допомогою яких вираз потрапляє за межі діапазону {0..UINT_MAX}, значення (UINT_MAX + 1) буде або додано, або віднято, поки результат НЕ потрапить у діапазон {0..UINT_MAX) і не буде визначено не визначеної поведінки .
Що таке точність?
Цілі особи мають біти для замітів, біти знаків та біти значень. У безпідписаних цілих чисел очевидно немає бітових знаків. Далі гарантовано, що непідписаний графік не має шматочків оббивки. Кількість бітів значень, яке має ціле число, - скільки точності має.
[Gotchas]
Сам макрос розміру макросу не може бути використаний для визначення точності цілого числа, якщо наявні біти для заміщення. А розмір байта не повинен бути октетом (вісім біт), як визначено у C99.
[1] Переповнення може статися в одній з двох точок. Перед додаванням (під час просування) - якщо у вас є непідписаний int, який занадто великий, щоб вміститись до int. Переповнення може виникнути і після додавання, навіть якщо неподписаний int знаходився в межах інтерва, після додавання результат все ще може переповнюватися.