欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

unsigned中無(wú)符號(hào)是什么詳析

 更新時(shí)間:2023年01月09日 11:23:44   作者:Jambo!  
unsigned為“無(wú)符號(hào)”的意思,unsigned,zerofill既為非負(fù)數(shù),用此類型可以增加數(shù)據(jù)長(zhǎng)度,下面這篇文章主要給大家介紹了關(guān)于unsigned中無(wú)符號(hào)是什么的相關(guān)資料,需要的朋友可以參考下

前言

想要弄清什么是無(wú)符號(hào),什么是有符號(hào),就需要先知道數(shù)據(jù)在計(jì)算機(jī)內(nèi)是如何存儲(chǔ)的

數(shù)據(jù)是如何儲(chǔ)存的

在計(jì)算機(jī)內(nèi),數(shù)據(jù)都是以二進(jìn)制的零一串的形式儲(chǔ)存的,并且稱帶符號(hào)的二進(jìn)制數(shù)稱為機(jī)器數(shù)
整數(shù)機(jī)器數(shù)有3種形式:原碼、反碼、補(bǔ)碼

  • 二進(jìn)制的最高位是符號(hào)位:0代表正數(shù),1代表負(fù)數(shù)。“無(wú)符號(hào)”和“有符號(hào)“中的”符號(hào)“就值得是這個(gè)符號(hào)位。
  • 按照一個(gè)數(shù)的正負(fù),直接寫(xiě)出它的二進(jìn)制表示形式就是原碼
  • 正數(shù)的原碼、反碼、補(bǔ)碼是相同的
  • 負(fù)數(shù)的原碼、反碼、補(bǔ)碼要經(jīng)過(guò)計(jì)算的
    • 反碼:原碼的符號(hào)位不變,其他位按位取反
    • 補(bǔ)碼:反碼+1
  • 在內(nèi)存中存儲(chǔ)的形式是補(bǔ)碼

int n = 10,整形占四個(gè)字節(jié)(32bit)
00000000000000000000000000001010 原碼
00000000000000000000000000001010 反碼
00000000000000000000000000001010 補(bǔ)碼
int n = -10
10000000000000000000000000001010 原碼
111111111111111111111111111111110101 反碼
111111111111111111111111111111110110 補(bǔ)碼

什么叫無(wú)符號(hào)

前面已經(jīng)知道,數(shù)據(jù)是以二進(jìn)制的形式儲(chǔ)存在內(nèi)存之中,并且二進(jìn)制的最高位為符號(hào)位

在C語(yǔ)言中,將基本數(shù)據(jù)類型劃分為signed(有符號(hào))和unsigned(無(wú)符號(hào))兩類
signed類中,有符號(hào),顧名思義就是二進(jìn)制的最高位代表著符號(hào)位,即0位正數(shù),1為負(fù)數(shù)。
而在unsigned中,無(wú)符號(hào),就是二進(jìn)制的最高位不是符號(hào)位,它是0或1并不代表著這個(gè)二進(jìn)制數(shù)為正或負(fù)

  • 初始化變量int a = 10它等價(jià)于signed int a =10因?yàn)殛P(guān)鍵字signed在定義的時(shí)候可以省略,C語(yǔ)言中默認(rèn)是有符號(hào)數(shù)所以我們以往定義的整形變量都是有符號(hào)數(shù)字
  • 如果想要定義一個(gè)無(wú)符號(hào)數(shù),就必須加關(guān)鍵字unsigned,定義一個(gè)無(wú)符號(hào)的10:unsigned int a = 10
  • 這里需要注意的一點(diǎn)是:因?yàn)闊o(wú)符號(hào)數(shù)字沒(méi)有符號(hào)位這個(gè)概念,數(shù)字連符號(hào)都沒(méi)有了沒(méi)有正負(fù)之分,所以它只能表示正數(shù)
  • 但是無(wú)符號(hào)數(shù)字也能存放負(fù)數(shù),這點(diǎn)是無(wú)符號(hào)數(shù)字中最”妙“的點(diǎn)

接下來(lái)用unsigned int a = 10unsigned int a = -10舉例進(jìn)行介紹

10為正數(shù),三碼都一樣,所以10的補(bǔ)碼為00000000000000000000000000001010 ,表面上看有無(wú)符號(hào)的10的補(bǔ)碼都一致,但是本質(zhì)上無(wú)符號(hào)的最高位不是符號(hào)位

-10的原碼為10000000000000000000000000001010
原碼除了符號(hào)位,其他取反加1得到反碼:111111111111111111111111111111110101
反碼加1得到補(bǔ)碼:111111111111111111111111111111110110
unsigned int a = -10然后把-10的補(bǔ)碼存到a中,所以此時(shí)無(wú)符號(hào)變量a中存放著:111111111111111111111111111111110110

因?yàn)?code>a為無(wú)符號(hào)變量,所以111111111111111111111111111111110110的最好位1不代表著符號(hào),所以a的本質(zhì)就是一個(gè)正數(shù),正數(shù)原碼、補(bǔ)碼、反碼相同,所以111111111111111111111111111111110110就是a所表示數(shù)字的原碼,所以輸出時(shí),就會(huì)把這個(gè)二進(jìn)制序列直接輸出。

接下來(lái)輸出一下無(wú)符號(hào)a的值:

int main()
{
	unsigned int a = -10;
	printf("%u\n", a);  //無(wú)符號(hào)的數(shù)用%u輸出
	return 0;
}

結(jié)果為:

這是一個(gè)很大的數(shù),我們用計(jì)算器驗(yàn)證一下二進(jìn)制序列111111111111111111111111111111110110的十進(jìn)制數(shù)是多少:

所以無(wú)符號(hào)a輸出的結(jié)果就是以-10的補(bǔ)碼為原碼的正數(shù)的十進(jìn)制

例題

例1

一下代碼的結(jié)果是:

#include <stdio.h>
int i;
int main()
{
    i--;
    if (i > sizeof(i))
    {
        printf(">\n");
    }
    else
    {
        printf("<\n");
    }
    return 0; 
}

A.>
B.<
C.不輸出
D.程序有問(wèn)題

在C語(yǔ)言中,全局變量,沒(méi)有初始化,默認(rèn)為0,i--后,i結(jié)果為-1,sizeof(i)按照i類型大小是4,所以按照此分析,結(jié)果應(yīng)為B,但B選項(xiàng)是錯(cuò)誤的

正確選項(xiàng)其實(shí)為A

因?yàn)?code>sizeof返回值類型為無(wú)符號(hào)整形,因此編譯器會(huì)自動(dòng)將左側(cè)的i轉(zhuǎn)換為無(wú)符號(hào)的整形數(shù)據(jù),-1的無(wú)符號(hào)整形是一個(gè)非常大的正數(shù),肯定超過(guò)4,所以正確選項(xiàng)為A

例2

//輸出的結(jié)果是什么?
int i= -20;
unsigned  int  j = 10;
printf("%d\n", i+j);
//按照補(bǔ)碼的形式進(jìn)行運(yùn)算,最后格式化成為有符號(hào)整數(shù)
  • i的原碼是:100000000000000000000000000010100
  • i的反碼是:1111111111111111111111111111111101011
  • i的補(bǔ)碼是:1111111111111111111111111111111101100
  • j 的補(bǔ)碼是:000000000000000000000000000001010
  • i+j的補(bǔ)碼是:1111111111111111111111111111111110110
  • i+j的原碼是: 100000000000000000000000000001010
  • i+j的值為-10,輸出-10

例3

//輸出結(jié)果?
unsigned int i;
for(i = 9; i >= 0; i--)
{
  printf("%u\n",i);
}

答案:死循環(huán)

分析:因?yàn)?code>i為一個(gè)無(wú)符號(hào)的int,所以當(dāng)i為0時(shí),再減1不會(huì)變成負(fù)數(shù),反而會(huì)變成一個(gè)極大的數(shù),必定大于0,然后這個(gè)極大的數(shù)逐漸-1,當(dāng)再次等于0時(shí),循環(huán)上述的操作,所以此程序是死循環(huán)。

總結(jié)

到此這篇關(guān)于unsigned中無(wú)符號(hào)的文章就介紹到這了,更多相關(guān)unsigned無(wú)符號(hào)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言經(jīng)典指針筆試題詳解

    C語(yǔ)言經(jīng)典指針筆試題詳解

    今天博主來(lái)講解4道經(jīng)典的指針筆試題,很多朋友沒(méi)有深刻理解函數(shù)傳參知識(shí)都會(huì)在這些題目上出錯(cuò),下面話不多說(shuō),我們開(kāi)始
    2021-10-10
  • C++函數(shù)指針和回調(diào)函數(shù)使用解析

    C++函數(shù)指針和回調(diào)函數(shù)使用解析

    這篇文章主要為大家詳細(xì)介紹了C++函數(shù)指針和回調(diào)函數(shù)的使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • C++實(shí)現(xiàn)LeetCode(65.驗(yàn)證數(shù)字)

    C++實(shí)現(xiàn)LeetCode(65.驗(yàn)證數(shù)字)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(65.驗(yàn)證數(shù)字),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 函數(shù)式宏定義與普通函數(shù)的區(qū)別

    函數(shù)式宏定義與普通函數(shù)的區(qū)別

    盡管函數(shù)式宏定義和普通函數(shù)相比有很多缺點(diǎn),但只要小心使用還是會(huì)顯著提高代碼的執(zhí)行效率,畢竟省去了分配和釋放棧幀、傳參、傳返回值等一系列工作,因此那些簡(jiǎn)短并且被頻繁調(diào)用的函數(shù)經(jīng)常用函數(shù)式宏定義來(lái)代替實(shí)現(xiàn)
    2013-10-10
  • C/C++詳解實(shí)現(xiàn)二層轉(zhuǎn)發(fā)

    C/C++詳解實(shí)現(xiàn)二層轉(zhuǎn)發(fā)

    數(shù)據(jù)鏈路層是開(kāi)放系統(tǒng)互連 (OSI) 模型中的第二層,該層用于通過(guò) LAN 等單一網(wǎng)絡(luò)進(jìn)行通信的節(jié)點(diǎn),第二層數(shù)據(jù)包不能從一個(gè)網(wǎng)絡(luò)傳輸?shù)搅硪粋€(gè)網(wǎng)絡(luò)。而二層轉(zhuǎn)發(fā)是根據(jù)報(bào)文的目的MAC直接進(jìn)行轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)過(guò)程中不用對(duì)報(bào)文的頭部做任何的修改
    2022-05-05
  • c++中l(wèi)og4cplus日志庫(kù)使用的基本步驟和示例代碼

    c++中l(wèi)og4cplus日志庫(kù)使用的基本步驟和示例代碼

    這篇文章主要給大家介紹了關(guān)于c++中l(wèi)og4cplus日志庫(kù)使用的相關(guān)資料,log4cplus是一款開(kāi)源的c++日志庫(kù),具有線程安全,靈活,以及多粒度控制的特點(diǎn),log4cplus可以將日志按照優(yōu)先級(jí)進(jìn)行劃分,使其可以面向程序的調(diào)試,運(yùn)行,測(cè)試,后期維護(hù)等軟件全生命周期,需要的朋友可以參考下
    2024-06-06
  • 關(guān)于C++內(nèi)存中字節(jié)對(duì)齊問(wèn)題的詳細(xì)介紹

    關(guān)于C++內(nèi)存中字節(jié)對(duì)齊問(wèn)題的詳細(xì)介紹

    本篇文章是對(duì)C++內(nèi)存中字節(jié)對(duì)齊的問(wèn)題進(jìn)行了詳細(xì)的分析與總結(jié)。需要的朋友參考下
    2013-05-05
  • C語(yǔ)言菜鳥(niǎo)基礎(chǔ)教程之Hello World

    C語(yǔ)言菜鳥(niǎo)基礎(chǔ)教程之Hello World

    C語(yǔ)言是一門(mén)通用計(jì)算機(jī)編程語(yǔ)言,應(yīng)用廣泛。C語(yǔ)言的設(shè)計(jì)目標(biāo)是提供一種能以簡(jiǎn)易的方式編譯、處理低級(jí)存儲(chǔ)器、產(chǎn)生少量的機(jī)器碼以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的編程語(yǔ)言。
    2017-10-10
  • C語(yǔ)言中const,volatile,restrict的用法總結(jié)

    C語(yǔ)言中const,volatile,restrict的用法總結(jié)

    以下是對(duì)C語(yǔ)言中const,volatile,restrict的用法進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-10-10
  • C++讀取帶空格字符串的方法

    C++讀取帶空格字符串的方法

    今天小編就為大家分享一篇C++讀取帶空格字符串的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07

最新評(píng)論