2016-10-12 5 views
3

Я никогда не сталкивался с такими переменными типами в python (хотя я все еще новичок в python и только что начал C).Диапазон значений в C

Я попадались типы переменных в C, и я смущен в точке, где диапазон значений приведены как this. я сделал следующие выводы:

  • Размер хранения количество которое может содержать определенный тип переменной. Но в отношении диапазона значений У меня есть много сомнений:

  • Я думаю, что диапазон значений является целым числом ДО, которое мы можем ввести в конкретной переменной:

Пример:

Я думаю, что для подписанного символа размер хранилища составляет 1 байт, и мы не могли ввести переменную1 = 128, но я ошибся, когда я составил простую программу;

#include <stdio.h> 
int main(void) 
{ 
    signed char variable1; 
    variable1 = 128; 
    printf("the value is: %d", variable1); 
    return 0; 
} 
The output of the compiler(using dev C++) was : 
    -127 

Таким образом, я думал, что он начнется с минимума, как только он пересечет его диапазон и произведет ошибку после 255, и я был прав. То же самое было верно для типа short int от типа -32,768 до 32,767. Но это не удалось для типа int -2,147,483,648 до 2,147,483,647. Он продолжал акцентировать.

Таким образом, вся моя перспектива в отношении диапазонов значений сошла на нет. Это может быть нечто более сложное, чем я себе представлял. Итак, каков диапазон значений переменных и как мы можем интерпретировать все эти странные результаты?

EDIT1: Я редактировал загрузить мои эксперименты:

experiments

+0

Статья, ссылка на которую вы ссылаетесь, является безнадежно устаревшей и неправильной - таблица размеров и диапазонов int особенно плоха. Вероятно, вам следует избегать этого веб-сайта в целом и использовать более надежную ссылку. –

+2

Возвращаемое значение -127, потому что произошло переполнение. Добро пожаловать в 'stackOverflow' :) –

+1

Я думаю, что выход будет иметь значение -128 –

ответ

2

"Диапазон значений в C" является широкая тема. Просто говоря о целых диапазонах, однобитовое целочисленное поле может иметь узкий диапазон от 0 до 1 или (от -1 до 0). intmax_t/uintmax_t относится к номерам в 64-битном диапазоне или более. Ограничения диапазона и преобразование между многими целыми типами в C - это сложный бит.


Для того, чтобы сосредоточить внимание на примере OP в:
В приведенном ниже, 128 является целая константа со значением 128 и типа int.

signed char variable1; 
variable1 = 128; 

signed char имеет диапазон SCHAR_MIN в SCHAR_MAX. Это, как правило, от -128 до 127, и может быть как от -127 до 127. (См C11 §5.2.4.2.1 1)

Назначение должно преобразовать int к signed char и применяется следующее за предполагаемый signed char диапазон: (курсив мой)

Когда значение с целочисленным типом преобразуется в другой целочисленный тип, кроме _Bool, если значение может быть представлено нового типа, он не изменяется. C11dr §6.3.1.3 1

В противном случае новый тип подписан , и значение не может быть представлено; либо результат определяется реализацией, либо сигнал, определяемый реализацией. C11dr §6.3.1.3 3

Типичный результат, определяемый реализацией, представляет собой обертывание дополнений 2, поэтому значение -128 является общим. Платформа OP сделала что-то другое и дала ей значение -127. Это определение реализации поведение. @2501


Не уверен, что "Выход компилятора (с использованием Dev C++) был: -127" означает OP правильно используя C компилятор. OP должен застраховать это.

+0

"См. C11 §5.2.4.2.1 1", что это? – BumbleBee

+0

см. Мои правки – BumbleBee

+1

Это правильный ответ. – 2501

0

То, что я думаю, что, в дополнение кодирования одних (который не является очень распространенным явлением в наши дни, но в былые времена, это было), существуют отдельные значения для +0 и -0, поэтому диапазон для 8-разрядной величины составляет от -127 до +127.

Но в процессорах, имеющих представление двух дополнений (что довольно часто), минимальное значение почти наверняка будет -128 на обоих языках C и C++. Причина, по которой вы гарантируете только -127, заключается в том, что она позволяет поддерживать представление дополнений не двух сторон.

Это связано с тем, как работает кодировка дополнения 2: 0 обрабатывается как «положительное» число (бит бит выключен), поэтому количество доступных положительных значений уменьшается на единицу.

Вы можете найти значение диапазона, которое указывается в классе char как константы. Это, вероятно, возвращает точный правильный диапазон, поддерживаемый системой.

Благодаря

Смежные вопросы