Java short
подписано, так что вы как бы лжете компилятору о том, что shortTest
получит.
Давайте рассмотрим последствия этого, посмотрев на следующий код C и соответствующую сборку ARM:
// Here I'm using int16_t, because that's basically what you've declared that
// you will pass to shortTest from your Java code.
void shortTest(int16_t input) {
printf("shortTest input: 0x%X\n", input);
}
int main() {
shortTest(-1);
}
shortTest:
stmfd sp!, {r4, lr}
mov r1, r0 @ Just pass on input as the second argument to printf
movw r0, #:lower16:.LC0 @ Load string address
movt r0, #:upper16:.LC0 @ ...
bl printf @ Call printf
ldmfd sp!, {r4, pc} @ Return
main:
stmfd sp!, {r4, lr}
mvn r0, #0 @ First argument = 0xFFFFFFFF
bl shortTest @ Call shortTest
mov r0, #0 @ Value to return from main
ldmfd sp!, {r4, pc} @ Return
Мой main
здесь будет ваш Java-код, поэтому он передает 0xFFFFFFFF
в shortTest
, что хорошо, потому что всем известно, что shortTest
хочет подписать короткое замыкание. Затем вы получите shortTest
, который (в вашем случае) думает, что он получил неподписанную короткую позицию, но предполагает, что вызывающая сторона передала правильный тип значения, поэтому он не будет выполнять нулевое расширение.
Затем вы пытаетесь напечатать это значение, и если ваша функция ведения журнала работает как printf
/ sprintf
, она будет неявно переводить ваш short
в int
, то есть будет печатать 32-битное значение (исключая ведущие нули). И 32-разрядное значение в этом случае 0xFFFFFFFF
.