Шорты в Android и Java
Я написал некоторый код, который использовал строки для представления времени, например "0620", но после тщательного размышления я понял, что их можно разбить на короткие части для сравнения производительности и увеличения объема памяти.
В модульном тесте у меня есть короткая запись, написанная как 0620, сравниваемая с возвращаемым значением 620, ожидая, что это сработает. Тем не менее, тест 0620 равняется 620 (оба являются короткими) не пройден.
Сообщение об ошибке говорит, что 0620 был прерван как 400 (и 400!= 620, объясняющий ошибку). Удаление отведения 0 устраняет проблему, но я хотел знать, что с этим происходит?
Это не работает
assertEquals("Time Failed", 0620, st.GetTime());
Это работает
assertEquals("Time Failed", 620, st.GetTime());
2 ответа
Целое буквальное начало, начинающееся с 0
интерпретируется как восьмеричное (основание 8) согласно спецификации языка Java:
Восьмеричное число состоит из цифры 0 ASCII, за которой следует одна или несколько цифр ASCII от 0 до 7, и может представлять собой положительное, нулевое или отрицательное целое число.
Я считаю, что это одна из причуд Java, унаследованных от C.
0620 означает восьмеричное (основание 8) в Java, я думаю, это то же самое в Android или 0620 == 400 не 620
int decVal = 26; // The number 26, in decimal
int octVal = 032; // The number 26, in octal
int hexVal = 0x1a; // The number 26, in hexadecimal