2個字節能存多少個16進制_Java語言中最大的整數再加1等于多少?看完秒懂

短文漲姿勢,看了不白看,不關注等啥?

已知Java語言中int類型所能表示的最大整數為2147483647,請問以下代碼執行結果是什么?

1f2d9b7b4e1cd06a246e60594ddad144.png

一部分人都會認為這段程序壓根就無法通過編譯,也有人認為,這段程序能夠通過編譯,但在運行時會拋出異常,但更多的人面對這道題目根本就無從下手。那么正確答案是什么呢?首先告訴大家,這段程序能夠順利通過編譯,并且在運行時也不會出現異常,運行的結果是在控制臺上輸出了數字-2147483648!而-2147483648正好是Java語言中int類型所能表示的最小整數。

這個運行結果可能會讓很多人感到大跌眼鏡,運行結果為什么會是這樣的呢?想弄明白其中的原理,就必須先弄清楚Java語言中數字的表示和存儲方式。

大家都知道:任何一個數字,存儲到計算機當中,都是以二進制的形式進行存儲的。在Java語言中,使用補碼的形式來表示數字。那么補碼是個什么東西呢?補碼就是計算機用二進制的形式表示數字的一種規則。它的算法很簡單:用最左邊的一個二進制位表示數字的正負,0表示正數,1表示負數,我們把表示符號的這個二進制位叫做“符號位”,而剩余的二進制位表示數字本身。至于怎樣用其余的二進制位表示數字,正數和負數略有區別。我們首先來說正數的情況。對于正數而言,直接用剩余二進制位表示這個數字就可以了。而對于負數而言,算法稍微復雜一點,分為兩步:

第一、用補碼表示出這個數的絕對值,之后把每個位上的數字(連同符號位上的數字在內)按位取反,所謂按位取反就是如果這個位上原來是0,那么就變成1,如果原來這個位上原來是1,那么就變成0。

第二、就是把這個取反以后的數字加上1,就得到了負數的補碼表示結果。

沒看懂?沒關系!咱們用例子說事。首先必須知道,Java語言中int類型的數據占4個字節,那么4個字節所能表示的最大整數是多少呢?按照補碼的表示規則,這個最大的整數存儲到計算機當中應該是“1個0跟31個1”:

69758ae691578fc95bbc59ca8d850236.png

如果我們強行給這個數再加1,按照二進制的進位規則,它會變成下面的樣子:

d360dda293012406071d473d51668251.png

這個數是多少?會是0嗎?我們來分析一下:首先最左邊的符號位從0變成了1,所以可以肯定,這個數是個負數。那么一個正數做了加1的操作,它應該變成一個更大的正數,現在怎么變成負數了呢?我們必須清楚,原來這個數的符號位是0,是因為加法運算產生了“進位”,才使得符號位變成了1,但是,計算機不管那么多,它只要看到最左邊的符號位是1,就認定這是一個負數。那么,這個負數的值是多少?我們可以按照補碼表示負數的規則,以逆運算的方式求出它的絕對值,就知道這個負數的值了。

前面講過:用補碼表示負數的算法分兩步進行,其中第二步,是在二進制數字上加1。那么反過來,這個過程的逆運算也要分兩步進行。其中第一步就應該是在原負數補碼的數字上減1,減1之后,剛才的數字就會變成下面的樣子

2483a4ffeadc91a333e0e0ba13eeab39.png

補碼求負數的第一步是對二進制數字按位取反,所以逆運算的第二步也是對各個位上的數字(連同符號位上的數字在內)按位取反,使得各個位數字恢復到原來的值。經過按位取反之后,剛才二進制數字又會變成下面的樣子

73561960d2ae4f865a34b2a0c3a5e0f1.png

細心的讀者可能已經發現,折騰了半天,又回到了逆運算之前的樣子!大家注意:表面上,這個二進制數跟逆運算之前是一個樣,但是它的意義已經完全不同了。在進行逆運算之前,這個二進制數是一個補碼形式表示的負數,而經過逆運算之后,這個二進制數變成了一個絕對值,既然是絕對值,它肯定不會是負數。因此,這個二進制數最前面的1并不表示負數,而是數字的一部分。那么這個絕對值是多少呢?轉換成十進制就是2147483648。所以,我們圖3中看到的那個“1開頭后面跟著31個0”所表示的負數,就是-2147483648!

到此為止,我想大家已經明白為什么程序的運行結果是-2147483648了吧?可能有一部分讀者會問:補碼當中,“1開頭后面跟著31個0”這個數字為什么不能解釋為:符號位上的1表示負數,后面的31位數字表示0,這樣形成的數字是-0,也就是0呢?其實,補碼的運算規則中特意強調了這一點。規則強調:補碼當中,對于0只有唯一一種表示形式,那就是32個0,其中最前面的0表示符號,后面的0表示數字。一旦遇到符號位是1,后面全是0的情況,必須按負數對待!既然要求我們按負數對待,那就必須通過逆運算來計算這個負數的絕對值。而我們計算得到的這個負數的絕對值就是2147483648。-2147483648是int類型的所能表示的最小值。因此,int類型數據的最大值再加1,一下子就變成了int類型的最小值,我們可以戲稱為“物極必反現象”。

那么,Java語言當中,其他三種類型的整數是否也有“物極必反現象”呢?對于long類型的變量來講,也存在這種現象,而對于byte和short類型,我們使用其最大值和1進行加法運算,無法再賦值給byte和short型的變量,因為這種操作在編譯時就會報錯。關于byte和short變量無法完成這種賦值操作的原因,大家可以看《Java語言中為byte和short類型變量賦值為啥會報錯?看完秒懂》進行詳細了解。

另外,通過這個例子,大家也應該明白為什么Java語言中,整數類型的表示范圍是不對稱的。比如, byte類型的數據最大值是是127,而最小并不是-127,而是-128。其原因就是補碼規則中,把0當作了正數看待,這樣的話正數這邊有個0,而負數那邊沒有,從而表示范圍不對稱。

看短文,漲姿勢,如想系統學習Java編程,點擊下方的“了解更多”即可,不讓你進去,用QQ登錄就可以啦!有問題也可以加入我的QQ群一起討論!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/394961.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394961.shtml
英文地址,請注明出處:http://en.pswp.cn/news/394961.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

擺脫加卡他卡_如何通過三個簡單的步驟擺脫“故事卡地獄”。

擺脫加卡他卡Your backlog is full of detailed user stories. Your team is no longer able to manage them, or rank them.您的待辦事項列表中包含詳細的用戶故事。 您的團隊不再能夠對其進行管理或排名。 You wonder what the product you’re building is all about. The …

套接字結構

套接字編程簡介 最近在看《UNIX網絡編程卷一》,算是寫的讀書筆記吧. IPv4套接字地址結構 IPv4套接字地址結構定義在 < netinet/in.h > 頭文件中.它以 sockaddr_in 命名.下面是它的結構體: struct in_addr {in_addr_t s_addr; 32位IPv4地址,網絡字節序 …

極樂科技CEO應邀出席2017微信小程序生態課

2019獨角獸企業重金招聘Python工程師標準>>> 1月9日凌晨小程序正式上線。張小龍第一時間在其朋友圈寫下一個日期—2007.1.9&#xff0c;并配上iPhone發布會的圖片&#xff0c;微信小程序如約而至。在興奮之際&#xff0c;極樂科技的大咖們也在思考&#xff1a;專注于…

藍橋杯 基礎練習 數列排序

http://lx.lanqiao.cn/problem.page?gpidT52 問題描述給定一個長度為n的數列&#xff0c;將這個數列按從小到大的順序排列。1<n<200輸入格式第一行為一個整數n。第二行包含n個整數&#xff0c;為待排序的數&#xff0c;每個整數的絕對值小于10000。輸出格式輸出一行&…

php 禁用通知,推送消息能不能區分禁止通知和卸載兩種類型?

消息推送ios用了apns&#xff0c;android用的是gcm。推送失敗都會返回無效的token&#xff0c;但是無效的tokne中&#xff0c;能不能區分到哪些是禁止通知&#xff0c;哪些是卸載app導致的呢&#xff1f;1 APNS PHP 的推送返回錯誤處理Push.php if (!empty($aMessage[ERRORS]))…

IOS13圖標尺寸_更新iOS13后,我的5臺iPhone都廢了

蘋果就是自帶熱搜體質&#xff0c;特別是在九月。機哥大概數了一下&#xff0c;光是線下發售后的這四天&#xff0c;iPhone 11 前前后后就上了 7 次熱搜。今天這一次熱搜&#xff0c;是因為庫克之前發了一條微博&#xff0c;夸自家 iPhone 11 是有史以來最出色的一款。在這條微…

Android 如何調用系統默認瀏覽器訪問

// 調用系統默認瀏覽器// 參考&#xff1a;// http://www.cnblogs.com/zhwl/archive/2011/11/15/2249848.html// https://segmentfault.com/a/1190000003912694case R.id.tv_about_weibo: // 關于微博// 直接打開 // Intent intent new Intent(); // …

kotlin函數式編程_我最喜歡的Kotlin函數式編程示例

kotlin函數式編程by Marcin Moskala通過Marcin Moskala One of the great things about Kotlin is that it supports functional programming. Let’s see and discuss some simple but expressive functions written in Kotlin.Kotlin的一大優點是它支持函數式編程。 讓我們看…

數據庫收縮

1.選中數據庫-任務-收縮-數據庫 2.全部壓縮 3.右鍵數據庫&#xff0c;屬性 4.找到自動收縮&#xff0c;設置為true 轉載于:https://www.cnblogs.com/RogerLu/p/10469819.html

matlab自帶kfcm函數,kfcmFun.m

function [center, U, obj_fcn] kfcmFun(data, cluster_n,maxit, kernel_b,expo)data_n size(data, 1); % 求出data的第一維(rows)數,即樣本個數obj_fcn zeros(100, 1);% 初始化輸出參數obj_fcnU initkfcm(cluster_n, data_n);% 初始化模糊分配矩陣,使U滿足列上相加為1inde…

flink sql udf jar包_Flink 生態:一個案例快速上手 PyFlink

簡介&#xff1a; Flink 從 1.9.0 版本開始增加了對 Python 的支持&#xff08;PyFlink&#xff09;&#xff0c;在剛剛發布的 Flink 1.10 中&#xff0c;PyFlink 添加了對 Python UDFs 的支持&#xff0c;現在可以在 Table API/SQL 中注冊并使用自定義函數。PyFlink 的架構如何…

賽思互動:為什么越來越多的企業愿意接受SaaS服務?

SaaS是Software-as-a-Service&#xff08;軟件即服務&#xff09;的簡稱&#xff0c;隨著互聯網技術的發展和應用軟件的成熟&#xff0c; 在21世紀開始興起的一種完全創新的軟件應用模式。SaaS 應用軟件的價格通常為“全包”費用&#xff0c;囊括了通常的應用軟件許可證費、軟件…

使用Google Cloud Platform分散您的應用程序

by Simeon Kostadinov通過Simeon Kostadinov 使用Google Cloud Platform分散您的應用程序 (Decentralize your application with Google Cloud Platform) When first starting a new software project, you normally choose a certain programming language, a specific frame…

pta通訊錄排序用python實現,python實現將android手機通訊錄vcf文件轉化為csv

經常會遇到將手機通訊錄導出到電腦并轉化為在電腦中可編輯的情況&#xff0c;在網上搜索了很久當前不外乎兩種處理方式。1.使用電腦的outlook的通訊簿功能&#xff0c;將手機導出的vcf文件導入到outlook的通訊錄中&#xff0c;然后再導出為可編輯文件&#xff1b;2.是使用專用軟…

從物聯網發展歷程看區塊鏈挑戰

2009年&#xff0c;中本聰發布了第一個比特幣節點&#xff0c;五年后區塊鏈儼然成為一個規模巨大的產業。 雖然看起來&#xff0c;基于區塊鏈的新的商業時代距離我們似乎只有一步之遙&#xff0c;但在2016年&#xff0c;我們已經意識到區塊鏈產業不會那么快獲得成功。 早期的新…

編程軟件python是什么意思_程序員Python編程必備5大工具,你用過幾個?

Python是編程入門不錯的選擇&#xff0c;現在也有不少的程序員業余時間會研究這門編程語言。 學習Python有時候沒有第一時間找到好工具&#xff0c;會吃不少的苦頭。畢竟好的工具能將工作效率多倍速提升。下面W3Cschool給小伙伴們推薦Python編程必備的5大工具&#xff1a; 0、I…

Linux ReviewBoard安裝與配置

目錄 0. 引言1. 安裝步驟2. 配置站點 2.1 創建數據庫2.2 開始安裝2.3 修改文件訪問權限2.4 Web服務器配置2.5 修改django相關配置正文 回到頂部0. 引言 環境&#xff1a;Ubuntu 14.04 Server&#xff08;虛擬機&#xff09; 這篇文章里說的是review board官方的安裝方式&#x…

小程序 graphql_GraphQL應用程序中的五個常見問題(以及如何解決)

小程序 graphqlby Sacha Greif由Sacha Greif GraphQL應用程序中的五個常見問題(以及如何解決) (Five Common Problems in GraphQL Apps (And How to Fix Them)) 了解如何釋放GraphQL的強大功能而不會遭受缺點 (Learn to unlock the power of GraphQL without suffering its dr…

又拍云 php5月18號那,又拍云文檔中心

移動流量平臺概述又拍云手機流量營銷平臺&#xff0c;整合移動、電信、聯通三大運營商流量資源&#xff0c;將強大的流量營銷服務&#xff0c;通過接口等形式提供給商家合作伙伴&#xff0c;幫助商家開展品牌宣傳、APP/游戲/微信公眾號/網站的拉新與促活等多種營銷活動。通過接…

SQL SERVER2000將多行查詢結果拼接到一行數據及函數的創建

處理前的查詢結果如上圖&#xff1a; 通過借助SQL變量的定義 DECLARE Scope varchar(1000) DECLARE Num int SET Scope SET Num 1 SELECT ScopeScopeconvert(varchar(8),Num)、DescScope DescOper;, Num Num1 From fuel_contractQualityNew Where ContractID0120090001…