2015-09-02 5 views
0

, например, в C, преобразование -1234 в неподписанные символ станет 46:В Java, как имитировать «преобразование отрицательных чисел, отличных от unsigned char в c»?

int main(){ 
    int a=-1234; 
    unsigned char b=a; 
    printf("%d\n",b); 
    return 0; 
}; 

Я хочу, чтобы преобразовать код в Java-версии, теперь код:

public class Test{ 
    public static void main(String[] args){ 
     int a=-1234; 
     int b=(a%(Byte.MAX_VALUE-Byte.MIN_VALUE+1))+(a<0?(Byte.MAX_VALUE-Byte.MIN_VALUE+1):0); 
     System.out.println(b); 
    } 
} 

Есть ли более быстрый (или более простой) способ сделать это (например: побитовая операция)?

+0

Char - это 16-битный тип данных. Почему вы используете байт? Кроме того, я думаю, что ваше преобразование примера c не определено и будет иметь разные результаты для разных целых представлений. – matt

+4

Что случилось с этим странным кодом? Это просто 'b = a & 0xFF' – harold

+0

Обратите внимание, что' unsigned char' не гарантируется какого-либо определенного размера. – juanchopanza

ответ

1
int a = -1234; 

a = (byte) a & 0xFF; 
System.out.println(a); 
//Output: 46 
-1
int a = -1234; 
    byte b = a < 0 ? (byte) -((byte) ((a^0xFFFFFFFF) + 1)) : (byte)a; 

    System.out.println(b); 
+1

'(a^0xFFFFFFFF) + 1' - забавный способ написания' -a' – harold

+0

Я просто хотел показать, что именно скрывается за «-» (отрицательной) операцией. Нехорошо, что неподписанные примитивы не поддерживаются java – Maks

0

Это не имитировать, это называется литье.

char a = (char)-1234; 
byte b = (byte)-1234; 
int unsigned = b>=0?b:128 - b; 
System.out.println((int)a + ", " + Byte.toUnsignedInt(b) + ", " + unsigned); 
//output 
//64302, 46, 46