каково действительное значение переменной t типа size_t, когда ей присваивается отрицательное значение? (может быть без знака int вместо size_t) - PullRequest
0 голосов
/ 06 июня 2019

Присвоение -1 переменной t типа size_t и проверка ее на равенство -1 и 4294967295 ( FFFFFFFF , комплимент 2 -1 ; моя система 64 бит ; значение может отличаться в зависимости от системы), тогда в обоих случаях возвращается 1 , т.е. правда .

Код

int main(){
    unsigned int t = 10;
    cout<<"t = -1: "<<(t==-1);  //checks if t is -1
    cout<<"\nt = 4294967295: "<<(t==4294967295);   //checks if t is 4294967295
    cout<<"\nt: "<<t;    //printing actual value of t
    int p = t;    //typecasting it to int
    cout<<"\np: "<<p;    //printing value of p
}

Фактический вывод -

t = -1: 1
t = 4294967295: 1
t: 4294967295
p: -1

возвращает 1 для обеих проверок (t==-1) и (t==4294697295), но выводит t = 4294697295 и выводит p = -1. Если переменная t содержит два значения, то есть -1 и 4294697295 . Что, безусловно, не так.

Требуется помощь. Что на самом деле происходит внутри системы ??

1 Ответ

2 голосов
/ 06 июня 2019

При сравнении значения со знаком со значением без знака, значение со знаком преобразуется в значение без знака перед сравнением. Это делается во время компиляции. Таким образом, t==-1 становится t==4294967295u, а t==4294967295 (целочисленный литерал со знаком) становится t==4294967295u.

Ссылка: http://eel.is/c++draft/expr.arith.conv

(1.5.3) В противном случае, если операнд с целочисленным типом без знака имеет ранг больше или равен рангу типа другого операнда, операнд с целочисленным типом со знаком должен быть преобразован в тип операнда с целочисленным типом без знака.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...