java 不规则 拼图_Java中不一致的操作会扩大规则
java 不規則 拼圖
總覽
當您在Java中執行一元或二進制運算時,標準行為是使用最寬的操作數(或對于byte , short和char ,使用更大的操作數)。 這很容易理解,但是如果考慮最佳類型可能會造成混淆。
乘法
當執行乘法時,您得到的數值通常比單個數值大得多。 即| a * b | >> | a | 和| a * b | >> | b | 通常是這種情況。 對于小型字體,這可以按預期工作。
考慮以下程序:
public static void main(String[] args) throws IOException {System.out.println(is(Byte.MAX_VALUE * Byte.MAX_VALUE));System.out.println(is(Short.MAX_VALUE * Short.MAX_VALUE));System.out.println(is(Character.MAX_VALUE * Character.MAX_VALUE));System.out.println(is(Integer.MAX_VALUE * Integer.MAX_VALUE));System.out.println(is(Long.MAX_VALUE * Long.MAX_VALUE)); }static String is(byte b) {return "byte: " + b; }static String is(char ch) {return "char: " + ch; }static String is(short i) {return "short: " + i; }static String is(int i) {return "int: " + i; }static String is(long l) {return "long: " + l; }打印:
int: 16129 int: 1073676289 int: -131071 int: 1 long: 1只有byte * byte和short * short不會溢出,因為它們已被擴展。 char * char即使允許,也不是有意義的操作。 但是int * int確實會溢出,即使我們有一個長類型也可以存儲此值而不會溢出。 byte和short都隱式加寬,但不是int 。 應該真正地將long擴展,但是我們沒有一個更寬泛的基本類型,這曾經是有意義的,但是如今64位基本類型看起來并不那么長。
師
從除數可以擴大結果的意義上講,除法有些奇怪。 除數比分子寬并不意味著結果會更大(但通常會更小)
System.out.println(is(Byte.MAX_VALUE / (byte) 1)); System.out.println(is(Byte.MAX_VALUE / (short) 1)); System.out.println(is(Byte.MAX_VALUE / (char) 1)); System.out.println(is(Byte.MAX_VALUE / (int) 1)); System.out.println(is(Byte.MAX_VALUE/ (long) 1));版畫
int: 127 int: 127 int: 127 int: 127 long: 127當你把一個byte/byte你會得到一個int即使你不能得到比一個大的值byte 。 (除非您將Byte.MIN_VALUE除以-1(在這種情況下, short會這樣做),并且如果將byte/long除以byte/long即使值仍然不能大于byte您也會得到long 。
模量
當執行模數a % b ,結果不能大于b 。 但是模數會擴大結果而不是減少結果。
System.out.println(is(Byte.MAX_VALUE % Byte.MAX_VALUE)); System.out.println(is(Byte.MAX_VALUE % Short.MAX_VALUE)); System.out.println(is(Byte.MAX_VALUE % Character.MAX_VALUE)); System.out.println(is(Byte.MAX_VALUE % Integer.MAX_VALUE)); System.out.println(is(Byte.MAX_VALUE % Long.MAX_VALUE));System.out.println(is(Byte.MAX_VALUE % (byte) 2)); System.out.println(is(Short.MAX_VALUE % (byte) 2)); System.out.println(is(Character.MAX_VALUE % (byte) 2)); System.out.println(is(Integer.MAX_VALUE % (byte) 2)); System.out.println(is(Long.MAX_VALUE % (byte) 2));版畫
int: 0 int: 127 int: 127 int: 127 long: 127 int: 1 int: 1 int: 1 int: 1 long: 1如果將X乘以一個數字,結果將不會比X寬/大,只能變小。 但是,捷豹路虎say必須擴大范圍。 如果將X乘以一個byte ,則結果只能在一個byte的范圍內。
我還提到了一元運算,也許最簡單的是一元減號。
System.out.println(is(-Byte.MIN_VALUE)); System.out.println(is(-Short.MIN_VALUE)); System.out.println(is(-Character.MIN_VALUE)); System.out.println(is(-Integer.MIN_VALUE)); System.out.println(is(-Long.MIN_VALUE));版畫
int: 128 int: 32768 int: 0 int: -2147483648 long: -9223372036854775808在前三種情況下,類型擴大了。 一個byte可以擴大到short ,但是作為一個int是正確的。 但是對于int和long ,它并沒有擴大,您可能會遇到罕見的溢出。
一元奇數是一元加號,它不會更改值(因此無法更改其范圍),但可以擴大值。
System.out.println(is(+Byte.MIN_VALUE)); System.out.println(is(+Short.MIN_VALUE)); System.out.println(is(+Character.MIN_VALUE)); System.out.println(is(+Integer.MIN_VALUE)); System.out.println(is(+Long.MIN_VALUE));版畫
int: -128 int: -32768 int: 0 int: -2147483648 long: -9223372036854775808我們可以解決這個問題嗎?
不幸的是沒有。 有太多代碼依賴于此邏輯。 例如說你寫這樣的東西。
long i = ... byte b = ... long l = i % b + Integer.MAX_VALUE;如果i%b要從long變為byte ,則此表達式可能會溢出。
結論
Java可以在需要時擴展某些值,但也不能擴展某些int操作,這實際上應該很long 。 即使這可能更合乎邏輯,它也永遠不會給出更窄的結果。
我們需要做的是了解邊緣情況,尤其是int * int ,并在看到這樣的操作時知道自己擴大它們。 例如
long l = (long) a * b;除非我們確信a * b將適合int值。
翻譯自: https://www.javacodegeeks.com/2015/02/inconsistent-operation-widen-rules-java.html
java 不規則 拼圖
總結
以上是生活随笔為你收集整理的java 不规则 拼图_Java中不一致的操作会扩大规则的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 生活习性是什么意思 生活习性的含义
- 下一篇: 自定义ui_如何允许用户自定义UI