Как правильно делать вычитание беззнаковых чисел?

Например, функция strlen() возвращает значение типа size_t. Как я поняла из хелпа к VS, этот тип определяется как максимально длинное (в байтах) целое беззнаковое число.

Я хочу определить какая из двух строк длиннее. Делаю так

char str1[100], str2[100];
// заполняю строки
size_t s1 = strlen(str1);
size_t s2 = strlen(str2);

И вот здесь мне хотелось бы получить разность s1 и s2 и по знаку этой разности определить какая из строк длиннее. Но s1 и s2 беззнаковые. Что делать?

Наткнулась на эту проблему с strlen(), но хотелось бы знать общее решение.

Грязно:

size_t sr = s1-s2 ;
if ( sr==0 )
{
    //s1==s2
} else if ( sr <= s1 )
    //s1 больше
} else 
{
    //s2 больше
}

Croessmah, ты наверно хотел сказать

} else if ( s2 < s1 )     // <--- !!!
    //s1 больше
} else 
{
    //s2 больше
}

Croessmah, ты наверно хотел сказать

В исходную задачу сначала посмотри:

И вот здесь мне хотелось бы получить разность s1 и s2 и по знаку этой разности определить какая из строк длиннее.

Croessmah, да, у тебя всё правильно. Просто невнимательно посмотрел.

А вообще, вопрос про вычитание беззнаковых чисел интересный. Я как то никогда не задумывался над этим. Хотя с другой стороны, чем «антипереполнение» при вычитании беззнаковых чисел принципиально отличается от переполнения при сложении знаковых или беззнаковых чисел? А с третьей стороны, у процессора есть флаг CF, если не ошибаюсь, который как раз реагирует на переполнения. Интересно из стандартной библиотеки есть к нему доступ?

В c++11 можно. Как дома буду, посмотрю в стандарте подробнее.

Вру. Для чисел с плавающей точкой есть, для целых не нашел.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.