-250 отпечатков как 6 - PullRequest
       1

-250 отпечатков как 6

1 голос
/ 21 августа 2011

Я не мог определить, как следующая программа выводит 6 и -250.

#include<stdio.h>

int main()
{
    unsigned char p=-250;
    printf("%d",p);
    unsigned int p1=-250;
    printf("%d",p1);
    return 0;
}

Будучи целым числом без знака, он должен выводить только положительные значения. Как значение p выдает 6?Пожалуйста, помогите мне понять.

Ответы [ 4 ]

5 голосов
/ 21 августа 2011

printf является небезопасным . Он печатает все, что вы просите, и %d говорит «целое число со знаком». ваша ответственность за предоставление вариабельного значения соответствующего типа. Поскольку ширина unsigned char составляет всего 8 бит, литерал -250 оборачивается до +6, который остается +6, когда интерпретируется как целое число со знаком. Обратите внимание, что char и short int (и их подписанные / неподписанные аналоги) получают все типы int при передаче через переменные аргументы.

3 голосов
/ 21 августа 2011

По умолчанию целые числа , такие как -250, имеют тип int. Кроме того, отрицательные значения сохраняются в памяти в форме дополнения до двух . Давайте вычислим форму дополнения до двух -250 (см. Создание формы дополнения до двух параграфа в вики):

  1. Положительный 250 - это 11111010 (первые 8 бит, ведущие нули опущены)
  2. Дополнить его и получить 00000101 (первые 8 бит, ведущие единицы опущены)
  3. Добавьте единицу и получите 00000110 (первые 8 бит, ведущие единицы опущены)

Правила преобразования типов для целочисленных типов в C говорят, что мы должны отбросить левые биты, чтобы получить 8-битный символ. Для более подробной информации смотрите K & R A.6.2 (ну, это для русского издания, может быть, в оригинальной книге есть другое место).

Таким образом, unsigned char p получает в точности значение 00000110 (6 в десятичном виде). Вот почему вы получаете 6 на выходе.

Думаю, теперь вы понимаете, почему в секунду -250 printf;)

2 голосов
/ 21 августа 2011

p1 равно unsigned, но модификатор %d обрабатывает соответствующий аргумент как подписанный, поэтому даже если он на самом деле положительный, он печатается как отрицательный.

Независимо от того, подписано ли числоили unsigned - это все о применяемом представлении, на уровне машины это не имеет значения.

2 голосов
/ 21 августа 2011

unsigned char может состоять только из чисел 0..255 числа преобразуются по модулю 256. Так что -250 приведено к 6

Вы не должны доверять этому поведению. вам следует избегать переполнения.

По состоянию на p1 он был приведен к unsigned int, но интерпретирован как p1 в printf() из-за %d идентификатора

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