Если я объявлю целое число в C, как показано ниже:
int an_example = 000300;
Можно ли как-то "отрезать" ведущие нули от целого числа? Я хочу, чтобы 000300 интерпретировалось как 300.
Если я объявлю целое число в C, как показано ниже:
int an_example = 000300;
Можно ли как-то "отрезать" ведущие нули от целого числа? Я хочу, чтобы 000300 интерпретировалось как 300.
Если вы пишете 0
в начале целочисленного литерала, это означает, что число восьмеричное. Восьмеричное число 300 равно десятичному числу 192, поэтому из этого кода вы получите значение 192.
Отрежьте ведущие нули с помощью клавиши удаления на клавиатуре.
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;
}
Важно понимать, что числа могут быть выражены в четырех распространенных представлениях в C: двоичном, восьмеричном, десятичном и шестнадцатеричном.
Например:
Двоичный (основание 2):
0b100101100 // 300 в двоичном формате. Начальные 0b сообщают компилятору, что это двоичное значение (не все компиляторы поддерживают это).
Восьмеричный (основание 8)
0300 // Это 192 в десятичной системе. Ведущий 0 сообщает компилятору, что значение восьмеричное.
Шестнадцатеричный (основание 16)
0x12C // 300 в десятичном формате. Ведущий 0x сообщает компилятору, что значение шестнадцатеричное.
Ваш номер: 000300 является восьмеричным числом и представляет 192 в десятичном виде, потому что у вас есть ведущий 0. Обратите внимание, что лишние начальные нули не влияют на значение.
Что касается вашего вопроса: нет, вы не можете включать ведущие нули и компилятор интерпретирует значение как десятичное.
0b
стандартизирована в C++14 и является расширением стандарта C в других местах.
- person Jonathan Leffler; 24.10.2014
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 в целочисленной константе означает, что она интерпретируется как восьмеричное число.)
Можно ли как-то "отрезать" ведущие нули от целого числа? Я хочу, чтобы 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);
300
десятичное, но вы вводите восьмеричное300
(192 dec
) и спрашиваете, можете ли вы удалить начальные нули? @_@ @ffhaddad Может быть, потому что сейчас это не имеет никакого смысла (восьмеричное упоминание отсутствует). Кроме того, ideone.com/H1WLUg действительно не помешает. Есть мягкое требование показать минимальные усилия... - person luk32   schedule 24.10.2014int an_example = DROP_LEAD_0(000300);
? Конечно, код может использовать#define 000300 300
, но это запутывание. - person chux - Reinstate Monica   schedule 24.10.2014000300
не интерпретируется как значение 300, и ищет обходной путь. Похоже, OP нужно показать 000300 в коде. Может быть, что-то столь же простое, какint an_example = 300; // 000300
? - person chux - Reinstate Monica   schedule 24.10.2014