Почему `-1 + unsigned(0) > 0` в С++?

Следующий код выводит -1 1 на C++.

Если i оценивается как -1, почему оно больше 0?

#include <stdio.h>

int main() {
  auto i = -1 + unsigned(0);
  printf("%d %d\n", i, i > 0);
}

Используйте std::cout, тогда вы не рискуете неправильно угадать типы для спецификаторов формата.

StoryTeller - Unslander Monica 05.04.2023 12:18

«Если я оценивается как -1»: это не так. Ваш printf просто неправильный. Избегайте его использования при написании C++. Вместо этого есть std::cout <<, а с C++20 также std::format. Сначала спросите себя, какой тип выводит auto в auto i. Вы можете проверить свою догадку с помощью static_assert(std::is_same_v<decltype(i), /*guess*/>);.

user17732522 05.04.2023 12:21

Согласно первому ответу: «В вашем случае у нас есть одно целое число без знака и целое число со знаком. Ссылаясь на (3) выше, поскольку оба операнда имеют одинаковый ранг, [...] нужно будет преобразовать целое число без знака. ."

E net4 05.04.2023 12:25

Использование printf в коде C++ всегда заканчивается слезами.

Sam Varshavchik 05.04.2023 13:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если я оценивается как -1

Это неправильная предпосылка.

i не -1. Добавление 0u (или unsigned(0)) к -1 приводит к unsigned. Вы можете увидеть -1 как вывод для i, потому что использование неправильного спецификатора формата с printf не определено.

Этот

#include <iostream>

int main() {
  auto i = -1 + unsigned(0);
  std::cout << i << " " << (i>0);
}

не полагается на угадывание типа i и печатает:

4294967295 1

unsigned(-1) — наибольшее целое число без знака, которое можно представить как unsigned.

Другие вопросы по теме