2013-07-27 1 views
2

Я только начал читать стандарт ISO C 2011, ну, последний публичный проект его [1], и понял, что в C Lexical Grammer [1] [458ff.] Все (литералы) числовые константы беззнаковые ,ISO C и подписанные литеральные константы

Означает ли это, что компилятор интерпретирует подписанную численную константу (например, -5.1E10 или -1) как вызов соответствующего унарного оператора? например -1 < => - (1), +512 < => + (512)

ОБНОВЛЕНИЕ: Моя вина, "все (буквенные) числовые константы без знака" Я «означают все (буквенные) числовые константы неотрицательны»

Regard, Томас

ответ

3

Все несуффилированные десятичные целые литералы подписаны, но они не могут быть отрицательными. Возможно, неотрицательный - это то, что вы подразумеваете под «неподписанным», но я думаю, что важно сделать различие - они не относятся к типу unsigned int.

Как только вы получили положительный литерал, применяется унарный оператор. Поэтому INT_MIN часто определяется как:

#define INT_MIN  (-2147483647 - 1) 

Потому что вы не можете представить 2147483648 с signed int на этой платформе.

+4

Нет, не все литералы подписаны, вы, вероятно, имеете в виду «все десятичные литералы без суффикса' U', подписанные ». Октальные и шестнадцатеричные литералы могут быть без знака, даже без суффикса 'U'. –

+0

Исправить. +1. –

2

Да, ваша интерпретация верна, то все число литералов не включают в себя знак, возможный знак унарный оператор применяется к нему.

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

1

все (буквальные) численные константы являются неподписанными.

Это неверно, на самом деле подписаны только не префиксные десятичные целые литералы. Другие целые литералы являются неподписанными или подписанными.

Означает ли это, что компилятор интерпретирует подписанную численную константу (например, -5.1E10 или -1) как вызов соответствующего унарного оператора? -1 < например => - (1), +512 < => + (512)

Если применить - к беззнаковое буквальным, его результат (обычно) до сих пор без знака. Например:

-1U   // unsigned quantity 
-0xFFFFFFFF // unsigned quantity (assuming 32-bit int) 

Подписанный результат преобразуется в беззнаковое через правила С целочисленного преобразования.