Почему компилятор не генерирует предупреждения для отрицательного значения с size_t?

В следующем коде я использовал size_t в качестве аргумента функции и передал отрицательное значение. Я скомпилировал программу на GCC (Linux), используя следующую команду.

g++ -Wall size.cpp -o size

GCC успешно скомпилирован без предупреждения, но результаты не такие, как я ожидал:

size_t : 18446744073709551615
int : -1

Код:

#include <iostream>

void func1(size_t i) 
{
  std::cout << "size_t : " << i << std::endl;
}

void func2(int i) 
{
  std::cout << "int : " << i << std::endl;
}

int main() 
{
  func1(-1);
  func2(-1);
  return 0;
}

Почему компилятор не генерирует предупреждения для отрицательного значения с size_t?


person msc    schedule 27.10.2017    source источник
comment
size_t — беззнаковый тип.   -  person tkausl    schedule 27.10.2017
comment
Я предлагаю вам немного узнать о дополнении до двух, которое — это (и наиболее распространенный) способ кодирования отрицательных целых чисел.   -  person Some programmer dude    schedule 27.10.2017
comment
@ Какой-то программист, чувак, Почему компилятор не выдает предупреждение об отрицательном значении с size_t?   -  person msc    schedule 27.10.2017
comment
Что вы ожидали? Отредактируйте свой вопрос, пожалуйста.   -  person Costantino Grana    schedule 27.10.2017


Ответы (1)


Поскольку size_t всегда без знака в С++:

Тип size_t — это определяемый реализацией целочисленный тип без знака, который достаточно велик, чтобы содержать размер в байтах любого объекта.


Почему компилятор не генерирует предупреждение для отрицательного значения с size_t?

Поскольку присвоение size_t отрицательного значения вызывает преобразование знакового в беззнаковое, которое четко определено:

Если целевой тип беззнаковый, результирующее значение является наименьшим целым числом без знака, соответствующим исходному целому числу (по модулю 2n, где n — количество битов, используемых для представления беззнакового типа). [Примечание. В представлении с дополнением до двух это преобразование является концептуальным, и битовый шаблон не изменяется (если нет усечения). —конец примечания]

person Sergey Kalinichenko    schedule 27.10.2017
comment
Существует множество четко определенных операций, которые выдают предупреждения. Например. if(test = 1) дает warning: using the result of an assignment as a condition without parentheses [-Wparentheses] по крайней мере с компилятором Clang C++. Таким образом, четкое определение не является достаточным условием для того, чтобы не генерировать предупреждение. - person z80crew; 08.09.2020