Неявное преобразование типов - PullRequest
1 голос
/ 07 октября 2010
#include<stdio.h>
int main(void)
{ 
  signed int a=-1;
  unsigned int b=1;
  int c= a+b;
  printf("%d\n",c);

  return 0;
  }

Согласно правилу неявного преобразования типов, если один операнд равен unsigned int, другой будет преобразован в unsigned int, а результатом будет unsigned int в двоичной операции. так что здесь b равно unsigned int, a должно быть приведено к типу unsigned int. Поскольку unsigned int всегда + ve, поэтому значение a будет равно 1.so c=1+1=2. Это 0. Как?

Ответы [ 3 ]

16 голосов
/ 07 октября 2010

-1, когда приведение к unsigned станет наибольшим возможным значением для этого типа - например, с 32-разрядным неподписанным, это будет 4,294,967,295. Когда к этому добавляется 1, значение «оборачивается» до 0.

2 голосов
/ 07 октября 2010

"a должен быть приведен к типу unsigned int. Поскольку unsigned int всегда + ve, поэтому значение a будет равно 1."

Исправить до "будет", но не после этого; -)

Результат преобразования целого числа со знаком в беззнаковый указан в стандарте 6.3.1.3/2:

.

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

Другими словами, отрицательное значение преобразуется в беззнаковое, принимая его значение по модулю некоторой степени 2, а не переворачивая знак.

0 голосов
/ 07 октября 2010

Современные машины в основном используют дополняющее два представление для отрицательных чисел.При добавлении двух чисел, если любое из них является отрицательным, оно сначала будет преобразовано в представление дополнения до двух.тогда эти два числа будут добавлены.Таким образом, компьютеры обычно выполняют 1 - 1 как 1 + two's complement of (-1).Это приводит к 0.

Для 1 - 2, это 1 + two's complement(-2).Проверьте эту программу, тот же номер, другое представление:

int main()
{
    signed int a = 1;
    unsigned int b = -2;

    int c = a+b;

    printf("%d\n%u\n", c, c);

    return 0;
}

Пожалуйста, прочитайте о дополнительном представлении двух.Это понадобится вам, чтобы стать программистом.

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