unsigned詳講(干貨滿滿)

前言過年偷懶了(●ˇ?ˇ●),但是年后開學了一定要恢復學習狀態,在復習加繼續學習的途中,我發現對于unsigned關鍵字的掌握并不是很熟練,于是翻閱了各個大佬的博客以及書籍,總結了對于unsigned的一些知識點。(如有不對的地方,歡迎各位大佬指正🤭)


什么是unsigned?

從字面上來看,不難理解,unsigned是無符號的意思,事實上,的確沒錯。它在C語言中和signed相反,signed是有符號的意思。其實C語言中的類型基本上都是有符號類型,只是省去了signed,

比如:(signed)int --> int

(signed char)-->char (這個取決于編譯器,絕大多數編譯器都是這個,比如我們常用的VS)

在了解什么是無符號之前,我們先了解一下什么是符號位(知道的童鞋可以跳過了)

在計算機處理二進制數據時,專門規定了一位符號位,來確定數據的正負,這個符號位通常是數據的最高位,如8比特位數據,左邊第一位就是符號位,剩下七位用來表示數據大小。

看例圖:

在知道符號位之后就很容易理解無符號了,無符號嘛就是沒有符號位,原來的符號位可以列入計算了。值得一提的是,無符號數都是非負數。


unsigned的深入理解

對于有符號類型的整形打印的時候用%d,對于無符號類型的整形打印時用%u

來看一下下面這幾個典型例題,讓你捋清它們之間的關系并且對unsigned有進一步的了解

例一:

我們將a初始化為無符號整形,將他以%u的形式打印時,我們知道整數在計算機中存儲是以二進制序列補碼的形式存儲的,正數的補碼和原碼一樣,但是負數的補碼是通過原碼到反碼到補碼轉換得到的。(這個會放在最后說)

-1的補碼是11111111111111111111111111111111(共計32位,因為int類型是4個字節,即32個比特位)

按照等比數列求和公式計算得到2^32-1=4294967295. 這與代碼跑出來的結果一致。

但是以%d的形式打印時為什么是-1呢?因為以%d形式打印時,系統會將a認為是有符號整形,自然而然的將第一位視為了符號位,經過反碼到原碼的反變換得到原碼是:10000000000000000000000000000001 即 -1。

我們經過調試發現在僅以%d形式打印完后,a的數值仍是4294967295。這說明在printf函數內部進行打印時以怎么樣的類型打印并不改變數據原來的類型。

例二:

對于這個題中涉及到了整型提升,如果不理解整型提升是無法理解這道題的。

所以在解決這道題之前,先簡單解釋一下什么是整型提升

整型提升:

整型提升是C程序設計語言中的一項規定:在表達式計算時,各種整型首先要提升為int類型,如果int類型不足以表示則要提升為unsigned int類型;然后執行表達式的運算。

這是百度百科里面給的解釋,是不是有些難以理解?那么來點通俗易懂的。

對于這道題來講,就是以%d(4字節)打印的時候,不足四個字節的類型比如short,char等類型就要發生整型提升來補到4個字節,正數補0,負數補1(往左端補)。比如變量a,它的類型是char類型,大小是1個字節,它的補碼是11111111,8個比特位,因為要以%d形式打印,所以要發生整型提升,就變成了11111111111111111111111111111111

打印時仍然為-1。

同樣變量b的類型是short,大小為兩個字節所以發生整型提升后也為11111111111111111111111111111111,結果為-1

變量c變量d都是不足4字節的無符號整形,(無符號整形視為非負數)發生整型提升時前面補0,最終序列為

c:00000000000000000000000011111111 ---->2^8-1=255

d00000000000000001111111111111111 ----->2^16-1=65535

變量e本身就是4個字節,無需發生整型提升。因為是無符號整型,所以視為非負數,原碼反碼補碼都一樣,2進制補碼為11111111111111111111111111111111

以%d形式(有符號整形)打印時第一位視為符號位,則視為負數,通過轉換得到原碼

10000000000000000000000000000001--->-1,最終結果為-1

由此我們得到結論:

對于負數:

//1.不發生整型提升的情況下,有符號數和無符號數以%u打印結果一樣。(因為以無符號整型打印,都吧把符號位納入計算)

//2.發生整型提升的情況下,有符號數前面補1,無符號數補0

例三:

通過之前的學習我們知道,sizeof是用來計算大小的單目操作符,那么a的類型是int,sizeof(a)是4,那顯然-1<4啊,理應輸出<,但是系統卻輸出了>,這是為什么呢?

通過查詢MSDN我們發現sizeof返回值是size_t類型,也就是unsigned int類型。

那么在a和其做比較時,a會被轉換為無符號類型作比較。a被轉換為無符號類型后大小為2^32-1,顯然大于4,所以輸出 >

By the way:此處的a仍然為int類型,只是作比較時視為無符號類型喲,和之前的printf有異曲同工之處。

結論:在將一個有符號整形和無符號整形作比較時,會將有符號整形視為無符號整形來作比較,但不改變有符號整形變量的性質。


附:計算機中二進制數據的原碼反碼補碼。

整形數據在計算機中存儲時都是以補碼形式存儲的,因為:

  1. 補碼使得符號位能與有效值部分一起參加運算,從而簡化運算規則。

  1. 使減法運算轉換為加法運算,進一步簡化計算機中運算器的線路設計。

  1. 保證了0的唯一性,保證了數的表示的準確性。

對于正數來講:

原碼反碼補碼都相同

對于負數來說:

反碼=原碼符號位不變,其他位按位取反

補碼=反碼+1

舉個例子:-10(以8bit位數據為例)

原碼:10001010

反碼:11110101

補碼:11110110


結語:

對于整數其實不管怎么存,它的二進制序列是不變的,只是解釋的方式不同,那么打印出來的數值就不同了.

ok辣,以上就是unsigned的詳細講解了。如有錯誤,歡迎指正qaq;如有不足,歡迎補充!

繼續加油啊,還是那句話:路漫漫其修遠兮,吾將上下而求索!!!

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

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

相關文章

數據結構與算法編程題18

循環隊列相關代碼。 #include <iostream> using namespace std;#define Maxsize 100 #define ERROR 0 #define OK 1 typedef int Elemtype; typedef struct Queue {Elemtype data[Maxsize];int front;int rear; }Queue;void Init_Queue(Queue &Q) {Q.front Q.rear …

P9 C++類

目錄 01 類是什么 02 如何創建類 03 方法 后話 本期我們要講的是 C 中的類。 我們終于講到了面向對象編程&#xff0c;這是一種非常流行的編程方式&#xff0c;面向對象編程實際上只是一種你可以采用的編寫代碼的方式&#xff0c;其他語言例如 C#、Java 這些主要是面向對象…

白嫖CTG4.0

大家好&#xff0c;到點了我來給各位大佬獻策CTG&#xff0c;不是花錢買不起&#xff0c;而是免費更有性價比&#xff0c;哈哈哈不調侃了我們自此開始正文&#xff0c;咱們主打的就是一個分享是一種態度 當然我更希望大家支持國產對國產有自己的信心&#xff08;文心一言&…

Git常用命令詳細總結,更適合中國寶寶體質

文章目錄 代碼倉庫創建倉庫1.進入需要創建代碼庫的文件夾2.創建/切始化倉庫3.關聯遠程倉庫拉取遠程倉庫到本地 添加文件到倉庫1.查看工作區狀態2.添加文件到暫存區3.提交到本地倉庫4.對比工作區文件變化 倉庫配置1.配置全局用戶名和郵箱2.配當前倉庫用戶名和郵箱3.查看Git全局配…

Selenium中常用的JS操作總結

? 目錄 前言&#xff1a; JS相關操作 JS Xpath定位 獲取單個元素 獲取元素集合 文本輸入 獲取坐標 獲取瀏覽器窗口的內部高度 獲取瀏覽器窗口的內部寬度&#xff1b; 坐標計算 設置樣式 設置窗口大小 類數組對象arguments JQuery選擇器 jQuery 選擇器 jQuery …

多模態——使用stable-video-diffusion將圖片生成視頻

多模態——使用stable-video-diffusion將圖片生成視頻 0. 內容簡介1. 運行環境2. 模型下載3. 代碼梳理3.1 修改yaml文件中的svd路徑3.2 修改DeepFloyDataFiltering的vit路徑3.3 修改open_clip的clip路徑3.4 代碼總體結構 4. 資源消耗5. 效果預覽 0. 內容簡介 近期&#xff0c;…

Linux上安裝Redis

案例中Linux版本為CentOS7.9&#xff0c;安裝目錄為 /root/software/ 1、使用 wget 命令從官網下載安裝包 wget https://github.com/redis/redis/archive/7.2.3.tar.gz2、解壓縮 tar -xzf 7.2.3.tar.gz3、進入解壓后的目錄 cd redis-7.2.34、 編譯和安裝Redis make make i…

npm中,你不了解的.npmrc文件

原文鏈接&#xff1a;npm中&#xff0c;你不了解的.npmrc文件 寫在前面 對于寫JS的程序員來說&#xff0c;可能沒有人不知道npm&#xff0c;但是有些同學對他的配置文件(即.npmrc文件)并不了解。結合我的學習心得&#xff0c;寫一篇博客跟大家分享一些該配置文件的知識。 .np…

理解CLIP模型

1.簡介 學習深度學習必看CLIP&#xff01;論文鏈接arxiv.org/pdf/2103.00020v1.pdf。 簡單來說就是傳統的分類任務被用來預測指定的類別&#xff0c;有監督訓練限制了模型的通用性和可用性&#xff0c;并且需要帶有標簽的數據來訓練&#xff0c;該篇論文就想直接從原始文本中…

Navicat 技術指引 | 適用于 GaussDB 的用戶權限設置

Navicat Premium&#xff08;16.2.8 Windows版或以上&#xff09; 已支持對 GaussDB 主備版的管理和開發功能。它不僅具備輕松、便捷的可視化數據查看和編輯功能&#xff0c;還提供強大的高階功能&#xff08;如模型、結構同步、協同合作、數據遷移等&#xff09;&#xff0c;這…

Spring 七大組件

文章目錄 Spring 七大組件 Spring 七大組件 核心容器(Spring core) 核心容器提供Spring框架的基本功能。Spring以bean的方式組織和管理Java應用中的各個組件及其關系。Spring使用BeanFactory來產生和管理Bean&#xff0c;它是工廠模式的實現。BeanFactory使用控制反轉(IOC)模式…

(Matalb分類預測)GA-BP遺傳算法優化BP神經網絡的多維分類預測

目錄 一、程序及算法內容介紹&#xff1a; 基本內容&#xff1a; 亮點與優勢&#xff1a; 二、實際運行效果&#xff1a; 三、部分代碼&#xff1a; 四、本文代碼數據說明手冊分享 一、程序及算法內容介紹&#xff1a; 基本內容&#xff1a; 本代碼基于Matalb平臺編譯&am…

Flink Flink中的分流

一、什么是分流 所謂“分流”&#xff0c;就是將一條數據流拆分成完全獨立的兩條、甚至多條流。也就是基于一個DataStream&#xff0c;定義一些篩選條件&#xff0c;將符合條件的數據揀選出來放到對應的流里。 二、基于filter算子的簡單實現分流 其實根據條件篩選數據的需求…

面了一個4年經驗的測試工程師,自動化都不會也要15k,我也是醉了····

&#x1f4e2;專注于分享軟件測試干貨內容&#xff0c;歡迎點贊 &#x1f44d; 收藏 ?留言 &#x1f4dd; 如有錯誤敬請指正&#xff01;&#x1f4e2;交流討論&#xff1a;歡迎加入我們一起學習&#xff01;&#x1f4e2;資源分享&#xff1a;耗時200小時精選的「軟件測試」資…

表單考勤簽到作業周期打卡打分評價評分小程序開源版開發

表單考勤簽到作業周期打卡打分評價評分小程序開源版開發 表單打卡評分 表單簽到功能&#xff1a;學生可以通過掃描二維碼或輸入簽到碼進行簽到&#xff0c;方便教師進行考勤管理。 考勤功能&#xff1a;可以記錄學生的出勤情況&#xff0c;并自動生成出勤率和缺勤次數等統計數…

本地緩存與分布式緩存

一、緩存的概念 在服務端編程當中&#xff0c;緩存主要是指將數據庫的數據加載到內存中&#xff0c;之后對該數據的訪問都在內存中完成&#xff0c;從而減少了對數據庫的訪問&#xff0c;解決了高并發場景中數據庫容易成為性能瓶頸的問題&#xff1b;以及基于內存的訪問速度高…

ruoyi-plus-vue部署

安裝虛擬機 部署文檔 安裝docker 安裝docker 安裝docker-compose 可能遇到的錯誤 Failed to deploy ruoyi/ruoyi-server:5.1.0 Dockerfile: ruoyi-admin/Dockerfile: Cant retrieve im age ID from build stream 安裝 vim 命令 yum install vim -y 修改文件 vim /etc/re…

flutter 無法從H5 WebView 訪問攝像頭和錄音權限

AndroidManifest.xml需要在 中添加以下權限&#xff1a; <uses-permission android:name"android.permission.INTERNET"/> <uses-permission android:name"android.permission.CAMERA" /> <uses-permission android:name"android.per…

基于Springboot的冬奧會科普平臺(有報告),Javaee項目,springboot項目。

演示視頻&#xff1a; 基于Springboot的冬奧會科普平臺&#xff08;有報告&#xff09;&#xff0c;Javaee項目&#xff0c;springboot項目。 項目介紹&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三層…

線性表之鏈式表

文章目錄 主要內容一.單鏈表1.頭插法建立單鏈表代碼如下&#xff08;示例&#xff09;: 2.尾插法建立單鏈表代碼如下&#xff08;示例&#xff09;: 3.按序號查找結點值代碼如下&#xff08;示例&#xff09;: 4.按值查找表結點代碼如下&#xff08;示例&#xff09;: 5.插入節…