Удалить ведущие нули из целого числа в C

Если я объявлю целое число в C, как показано ниже:

int an_example = 000300;  

Можно ли как-то "отрезать" ведущие нули от целого числа? Я хочу, чтобы 000300 интерпретировалось как 300.


person 今天春天    schedule 24.10.2014    source источник
comment
Это восьмеричное число в исходном коде C, так как оно начинается с 0. У чисел нет нулей, они могут быть только в их представлении.   -  person Basile Starynkevitch    schedule 24.10.2014
comment
Нет, эти ведущие нули делают число восьмеричным.   -  person Cornstalks    schedule 24.10.2014
comment
Почему вы хотите именно так?   -  person ani627    schedule 24.10.2014
comment
Почему все голосуют против вопроса? Это то, что я ненавижу в людях на SO. Как это не корректный вопрос? Может быть, он программист-любитель и не знает о восьмеричной нотации.   -  person ffhaddad    schedule 24.10.2014
comment
О чем вообще этот вопрос? Вы хотите, чтобы int интерпретировалось как 300 десятичное, но вы вводите восьмеричное 300 (192 dec) и спрашиваете, можете ли вы удалить начальные нули? @_@ @ffhaddad Может быть, потому что сейчас это не имеет никакого смысла (восьмеричное упоминание отсутствует). Кроме того, ideone.com/H1WLUg действительно не помешает. Есть мягкое требование показать минимальные усилия...   -  person luk32    schedule 24.10.2014
comment
Интересно, можно ли удалить ведущие 0 с помощью макроса, как в int an_example = DROP_LEAD_0(000300);? Конечно, код может использовать #define 000300 300, но это запутывание.   -  person chux - Reinstate Monica    schedule 24.10.2014
comment
Может быть, OP не понимает восьмеричное число, но, возможно, понимает. ИМО, OP, очевидно, знает, что буквальная строка 000300 не интерпретируется как значение 300, и ищет обходной путь. Похоже, OP нужно показать 000300 в коде. Может быть, что-то столь же простое, как int an_example = 300; // 000300?   -  person chux - Reinstate Monica    schedule 24.10.2014


Ответы (5)


Если вы пишете 0 в начале целочисленного литерала, это означает, что число восьмеричное. Восьмеричное число 300 равно десятичному числу 192, поэтому из этого кода вы получите значение 192.

Отрежьте ведущие нули с помощью клавиши удаления на клавиатуре.

person Lundin    schedule 24.10.2014

000300

Это восьмеричная константа. Более кратко это можно записать как

0300

Это значение равно десятичному значению 192.

Если вы хотите десятичное число 300, напишите

300

Но будьте очень ясны, что 0300 != 300.

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

#include <stdio.h>

int main(void)
{
    printf("%d\n", 000300);
    printf("%d\n", 0300);
    printf("%d\n", 300);
    return 0;
}
person David Heffernan    schedule 24.10.2014

Важно понимать, что числа могут быть выражены в четырех распространенных представлениях в C: двоичном, восьмеричном, десятичном и шестнадцатеричном.

Например:

Двоичный (основание 2):

0b100101100 // 300 в двоичном формате. Начальные 0b сообщают компилятору, что это двоичное значение (не все компиляторы поддерживают это).

Восьмеричный (основание 8)

0300 // Это 192 в десятичной системе. Ведущий 0 сообщает компилятору, что значение восьмеричное.

Шестнадцатеричный (основание 16)

0x12C // 300 в десятичном формате. Ведущий 0x сообщает компилятору, что значение шестнадцатеричное.

Ваш номер: 000300 является восьмеричным числом и представляет 192 в десятичном виде, потому что у вас есть ведущий 0. Обратите внимание, что лишние начальные нули не влияют на значение.

Что касается вашего вопроса: нет, вы не можете включать ведущие нули и компилятор интерпретирует значение как десятичное.

person ffhaddad    schedule 24.10.2014
comment
Обратите внимание, что двоичная запись 0b стандартизирована в C++14 и является расширением стандарта C в других местах. - person Jonathan Leffler; 24.10.2014
comment
@Jonathan Leffler В мире есть 3 типа людей: Те, кто делит мир на два, и те, у кого их нет. :-) - person chux - Reinstate Monica; 24.10.2014
comment
@chux: 3 типа? Я думал, что есть 10 типов — те, кто мыслит бинарно, и те, кто нет. - person Jonathan Leffler; 24.10.2014
comment
Кстати: числа также могут быть выражены как integer-constant, как 4, которые вы представили. Есть также floating-constant как int a = 1e4;, enumeration-constant как int b = fred; и character-constant как int c = 'C';. - person chux - Reinstate Monica; 24.10.2014

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

(Кстати, начальный 0 в целочисленной константе означает, что она интерпретируется как восьмеричное число.)

person Graham Borland    schedule 24.10.2014

Можно ли как-то "отрезать" ведущие нули от целого числа? Я хочу, чтобы 000300 интерпретировалось как 300.

Целые числа всегда имеют одно и то же внутреннее представление — вы не беспокоитесь о проблемах форматирования, таких как начальные нули. Как отметил @BasileStarynkevitch в комментариях, начальный 0 в целочисленной константе заставляет компилятор интерпретировать число как восьмеричное или основание 8. Если вы удалите начальные нули из предоставленного вами кода, an_example изменится с 300 восьмеричных (192 десятичных ) до 300 десятичных (454 восьмеричных).

То, как вы отображаете an_example, — это другой вопрос, а их наличие полностью зависит от используемого вами спецификатора формата. Например, если вы хотите напечатать восьмеричное число, но без начального 0, вы должны использовать спецификатор %o:

printf("%o", an_example);

Если вы хотите напечатать его как десятичное число, используйте %d вместо %o выше.

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

printf("%#o", an_example);
person Caleb    schedule 24.10.2014