国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

關(guān)于 Java 中的強(qiáng)制類(lèi)型轉(zhuǎn)換

wind5o / 1346人閱讀

摘要:?jiǎn)栴}描述遇到一個(gè)題目經(jīng)過(guò)強(qiáng)制類(lèi)型轉(zhuǎn)換以后,變量,的值分別為多少答案是這涉及到的,打算借此稍稍研究一下。分為兩種,一是擴(kuò)展型基本數(shù)據(jù)類(lèi)型轉(zhuǎn)換,二是窄化型基本數(shù)據(jù)類(lèi)型轉(zhuǎn)換。需要注意的是是有可能丟失數(shù)值的整體信息以及損失精度和范圍的。

問(wèn)題描述

遇到一個(gè)題目:

經(jīng)過(guò)強(qiáng)制類(lèi)型轉(zhuǎn)換以后,變量a,b的值分別為多少?  
short a = 128;
byte b = (byte) a;
a = ?, b = ?

答案是:a = 128, b = -128

這涉及到 Java primitive type 的 conversion,打算借此稍稍研究一下。

分析過(guò)程

下面分析中會(huì)涉及到一些與題目無(wú)關(guān)的細(xì)節(jié),想直接看題目解答的請(qǐng)?zhí)?"題目中的數(shù)值在內(nèi)存中的表示"

明確 Java 中的 Conversion

Java 的 conversion 有多種,這里我們只討論 primitive conversion。

primitive conversion 分為兩種,一是 Widening Primitive Conversion(擴(kuò)展型基本數(shù)據(jù)類(lèi)型轉(zhuǎn)換),二是 Narrowing Primitive Conversion(窄化型基本數(shù)據(jù)類(lèi)型轉(zhuǎn)換)。

ps: 翻譯成中文還是感覺(jué)怪怪的,下面還是用英文表示吧。

1. Widening Primitive Conversion

JLS 定義了 19 種 widening pc,簡(jiǎn)單來(lái)說(shuō),就是位數(shù)低的向高的轉(zhuǎn)換,如下

byte to short, int, long, float, or double

short to int, long, float, or double

char to int, long, float, or double

int to long, float, or double

long to float or double

float to double

widening pc 不會(huì)丟失數(shù)值的整體大小信息

2. Narrowing Primitive Conversion

這個(gè)問(wèn)題涉及到的 int -> short 和 short -> byte 的轉(zhuǎn)換就包含在 JLS 定義的 22 種 narrowing pc 之中。

short to byte or char

char to byte or short

int to byte, short, or char

long to byte, short, char, or int

float to byte, short, char, int, or long

double to byte, short, char, int, long, or float

需要注意的是 narrowing pc 是有可能丟失數(shù)值的整體信息以及損失精度和范圍的。

可能有人會(huì)注意到,上面的 widening pc 和 narrowing pc 都沒(méi)有包含 byte -> char 的轉(zhuǎn)換

Chapter 5. Conversions and Promotions

The following conversion combines both widening and narrowing primitive conversions:
byte to char
First, the byte is converted to an int via widening primitive conversion (§5.1.2), and then the resulting int is converted to a char by narrowing primitive conversion (§5.1.3).

這是因?yàn)檫@是一種特殊地、同時(shí)結(jié)合了 widening pc 和 narrowing pc 的轉(zhuǎn)換,byte 會(huì)先轉(zhuǎn)換成 int(widening pc),然后將這個(gè) int 結(jié)果轉(zhuǎn)換成 char(narrowing pc)。

具體分析

那么我們還是回到這個(gè)問(wèn)題

short a = 128; 
byte b = (byte) a;

首先,在 Java 中,整數(shù)默認(rèn)為 int 類(lèi)型,也就是說(shuō),在 short a = 128; 中,會(huì)發(fā)生 int -> short 的 narrowing pc,是有可能損失精度的,由于 int 是高位(32位),short 是低位(16位),所以在轉(zhuǎn)換時(shí)會(huì) truncate。同樣,對(duì)于 byte b = (byte) a; 也有可能因?yàn)?truncate 而損失精度。

先回顧原碼、反碼、補(bǔ)碼的概念

在 Java 中數(shù)值是用補(bǔ)碼表示的,在這里回顧一下原碼、反碼、補(bǔ)碼的概念(以 3 為例吧):

原碼(第一個(gè)為符號(hào)位,1 表示負(fù)數(shù),0 表示正數(shù))

3 的原碼:0000 0011

-3 的原碼:1000 0011

反碼(就是反過(guò)來(lái),注意符號(hào)位不變):

3 的反碼:1111 1100

-3 的反碼:1111 1100

補(bǔ)碼(正數(shù)的補(bǔ)碼 = 原碼,負(fù)數(shù)的補(bǔ)碼 = 反碼 + 1)

3 的補(bǔ)碼:0000 0011

-3 的補(bǔ)碼:1111 1101

題目中的數(shù)值在內(nèi)存中的表示

二進(jìn)制表示:

int a = 128 00000000 00000000 10000000 00000000

short a = 128 00000000 10000000 (強(qiáng)轉(zhuǎn)后前面 16 位被截?cái)啵?/p>

可以看出來(lái),a 的值輸出應(yīng)該還是 128

那么對(duì)于 byte b = (byte) a;

二進(jìn)制表示:

short a = 128 00000000 10000000

byte b = 128 10000000 (強(qiáng)轉(zhuǎn)后前面 8 位被截?cái)啵?/p>

但是,輸出的 b 的值為什么不是 128 而是 -128 呢

Primitive Data Types (The Java? Tutorials > Learning the Java Language > Language Basics)

byte: The byte data type is an 8-bit signed two"s complement integer. It has a minimum value of -128 and a maximum value of 127 (inclusive). The byte data type can be useful for saving memory in large arrays, where the memory savings actually matters. They can also be used in place of int where their limits help to clarify your code; the fact that a variable"s range is limited can serve as a form of documentation.

這是因?yàn)?byte 是一個(gè) 8 位有符號(hào)二進(jìn)制補(bǔ)碼整數(shù),它包含的值的范圍是 [-128, 127],因此 byte 類(lèi)型的值是無(wú)法表示 128 的

那么在發(fā)生截?cái)嗪螅?000 0000 表示的就是一個(gè)補(bǔ)碼,從這個(gè)補(bǔ)碼可以看出來(lái)它的原碼肯定是一個(gè)負(fù)數(shù),那么我們根據(jù)這個(gè)補(bǔ)碼反推得到它的反碼:1111 1111,從而得到它的原碼:1000 0000,可以看出這個(gè)值就是 -0,但是在我們的生活中是沒(méi)有 -0 的,所以在計(jì)算機(jī)中就把它識(shí)別成 -128,因此這就是為什么 b 的值的輸出是 -128 的原因。

ps: 關(guān)于 -0 對(duì)應(yīng)于 -128 的具體解釋,我懶得寫(xiě)了,因?yàn)楦杏X(jué)取決于個(gè)人的理解,不想細(xì)究,如果有人還有疑問(wèn),可以看看這個(gè)人的解釋 byte類(lèi)型取值范圍為什么是127到-128? - 知乎

那么到這里,問(wèn)題就基本解釋清楚了,感覺(jué)自己還是很啰嗦,不過(guò)其實(shí)是為了回顧一些基礎(chǔ)的知識(shí),也希望對(duì)其他人有所幫助啦~

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/69394.html

相關(guān)文章

  • 關(guān)于java中的強(qiáng)制類(lèi)型轉(zhuǎn)換和二進(jìn)制表示問(wèn)題

    摘要:中用補(bǔ)碼形式表示第一位正負(fù)位,表示負(fù),表示正。原碼一個(gè)數(shù)的二進(jìn)制表示。的補(bǔ)碼是的補(bǔ)碼是占個(gè)字節(jié),位占個(gè)字節(jié),位所以強(qiáng)轉(zhuǎn)時(shí)會(huì)截?cái)唷? showImg(https://segmentfault.com/img/bVbsydY?w=993&h=471); 1、Java中用補(bǔ)碼形式表示2、第一位正負(fù)位,1表示負(fù),0表示正。3、原碼:一個(gè)數(shù)的二進(jìn)制表示。 3的原碼0000...

    cyixlq 評(píng)論0 收藏0
  • 基本類(lèi)型類(lèi)型轉(zhuǎn)換(隱式類(lèi)型轉(zhuǎn)換)和強(qiáng)制類(lèi)型轉(zhuǎn)換(譯一)

    摘要:基本類(lèi)型的類(lèi)型轉(zhuǎn)換和強(qiáng)制類(lèi)型轉(zhuǎn)換一的變量類(lèi)型分為種。目錄基本類(lèi)型的類(lèi)型轉(zhuǎn)換隱式類(lèi)型轉(zhuǎn)換基本類(lèi)型的強(qiáng)制類(lèi)型轉(zhuǎn)換基本類(lèi)型的類(lèi)型轉(zhuǎn)換隱式類(lèi)型轉(zhuǎn)換基本類(lèi)型的類(lèi)型轉(zhuǎn)換是通過(guò)擴(kuò)展轉(zhuǎn)換的規(guī)則完成的。 基本類(lèi)型的類(lèi)型轉(zhuǎn)換和強(qiáng)制類(lèi)型轉(zhuǎn)換(一) Java的變量類(lèi)型分為2種?;绢?lèi)型(原始類(lèi)型)和引用類(lèi)型?;绢?lèi)型包括以下八種類(lèi)型:boolean、 char、byte、short、int、long、floa...

    pcChao 評(píng)論0 收藏0
  • 棧和隊(duì)列 - Algorithms, Part I, week 2 STACKS AND QUEUE

    摘要:在改進(jìn)前使用數(shù)組的一個(gè)缺點(diǎn)是必須聲明數(shù)組的大小,所以棧有確定的容量。待解決的問(wèn)題建立一個(gè)能夠增長(zhǎng)或者縮短到任意大小的棧。下邊的圖是觀察時(shí)間開(kāi)銷(xiāo)的另一種方式,表示了入棧操作需要訪問(wèn)數(shù)組的次數(shù)。 前言 上一篇:算法分析下一篇:基本排序 本篇內(nèi)容主要是棧,隊(duì)列 (和包)的基本數(shù)據(jù)類(lèi)型和數(shù)據(jù)結(jié)構(gòu)文章里頭所有的對(duì)數(shù)函數(shù)都是以 2 為底關(guān)于性能分析,可能還是需要一些數(shù)學(xué)知識(shí),有時(shí)間可以回一下在很多...

    Stardustsky 評(píng)論0 收藏0
  • 多態(tài)

    摘要:父類(lèi)型引用指向子類(lèi)型對(duì)象多態(tài)以下程序編譯是沒(méi)有問(wèn)題的,因?yàn)榫幾g器檢查到的數(shù)據(jù)類(lèi)型是和之間存在繼承關(guān)系,并且是父類(lèi)型,是子類(lèi)型,父類(lèi)型轉(zhuǎn)換成子類(lèi)型叫做向下轉(zhuǎn)型,語(yǔ)法合格。 package duotai;public class Animal { public void move() { System.out.pr...

    Magicer 評(píng)論0 收藏0
  • 1.java數(shù)據(jù)類(lèi)型

    摘要:雖然定義了這種數(shù)據(jù)類(lèi)型,但是只對(duì)它提供了非常有限的支持。數(shù)據(jù)類(lèi)型的自動(dòng)轉(zhuǎn)換規(guī)律數(shù)據(jù)范圍小的類(lèi)型與數(shù)據(jù)范圍大的類(lèi)型進(jìn)行數(shù)學(xué)計(jì)算的時(shí)候,自動(dòng)向數(shù)據(jù)范圍大的類(lèi)型轉(zhuǎn)換數(shù)據(jù)范圍大的類(lèi)型想要變?yōu)閿?shù)據(jù)范圍小的類(lèi)型,必須采用強(qiáng)制類(lèi)型轉(zhuǎn)轉(zhuǎn)。 java數(shù)據(jù)類(lèi)型 java一共分為兩大類(lèi)數(shù)據(jù): 基本數(shù)據(jù)類(lèi)型(值類(lèi)型) 引用數(shù)據(jù)類(lèi)型 基本數(shù)據(jù)類(lèi)型 基本數(shù)據(jù)類(lèi)型一共有八種,分為:數(shù)值型: 整型: byte、s...

    dunizb 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<