c語言 資料型別轉換(換一種規則讀取補碼)

2021-09-27 08:34:56 字數 3933 閱讀 1540

1、有符號數轉無符號數:符號位變成資料的一部分且不變

1,隱式轉換

c在以下四種情況下會進行隱式轉換:

1、算術表示式中,低型別能夠轉換為高型別。

2、賦值表示式中,右邊表示式的值自動隱式轉換為左邊變數的型別,並賦值給他。

3、函式呼叫中引數傳遞時,系統隱式地將實參轉換為形參的型別後,賦給形參。

4、函式有返回值時,系統將隱式地將返回表示式型別轉換為返回值型別,賦值給呼叫函式。

2,算數運算的隱式轉換

算數運算中,首先有如下型別轉換規則:

1、字元必須先轉換為整數(c語言規定字元型別資料和整型資料之間可以通用) 。

2、short型轉換為int型(同屬於整型) 。

3、float型資料在運算時一律轉換為雙精度(double)型,以提高運算精度(同屬於實型) 。

其次,有下面的規則。

當不同型別的資料進行操作時,應當首先將其轉換成相同的資料型別,然後進行操作,轉換規則是由低階向高階轉換。轉換規則如下圖所示:

正數:原始碼=反碼=補碼

負數的原始碼=首位1+對應正數後七位原始碼:

比如-128原始碼=1+000_0000(127原始碼1000_0000)

負數的三碼:

原碼:相同絕對值的正數+最高位置1

00000000

00000000

00000000

00000101 是5的原碼。

10000000

00000000

00000000

00000101 是-

5的原碼。

反碼:負數原始碼(除符號位外)全部取反

負數10000000

00000000

00000000

00000101每一位取反(除符號位),得11111111

11111111

11111111

11111010。

補碼:對負數的原碼(除符號位外)各位取反,然後在最後一位加1

比如:10000000

00000000

00000000

00000101 的反碼是:11111111

11111111

11111111

11111010

byte型別的取值範圍:有符號的[-128,127] 無符號的[0,255]

對於有符號的資料型別來說:最高位為符號位 0 為正數,1為負數

例如:

5 表示為 0000 0101

-5表示為( 原碼):1000 0101 ===> 反碼:1111 1010 ===> 補碼:1111 1011

-128 的原碼,反碼,補碼:

-128原始碼1000 0000(128原始碼=1000 0000→轉換成-128即首位1+後7位000_0000)

故-128 補碼1000 0000 (1111 1111(反碼) + 1 = 1000 0000,這裡實際上真正相加的是1111 1111後面的7位,第1位是符號位始終不會變,所以,當進到第8位的時候,溢位了,會被捨棄)

資料型別轉換本質是換一種新的方式解讀二進位制資料

長的資料→轉化成→短資料----本質是裁剪

比如int→char 所做的即將int的低1個位元組給予char

舉例:三碼之間轉換:

int a = 256 ; //00000000 00000000 00000001 00000000

byte b = a ; //去高位 得到 0000_0000 byte位元組=0

// 當a=255=1111 1111時

//擷取地位1位元組作為byte:11111111(儲存時以補碼存放)

//求得對應反碼:1111 1110→→原碼 : 1000 0001 即byte b= -1

unsigned int a = (unsigned)-1;   對應補碼1111 1111 1111 1111 1111 1111 1111 1111 即2^32-1=4294967296-1=4294967295

printf("%u\n",a); //輸出結果是 4294967295

首先拿過來就是計算它們的二進位制位:

unsigned int x = 134 = 1000_0110b = x補   沒有符號位,或者第九位符號位=0

unsigned int y = 246 = 1111_0110b = y補

[-y]補 = y補(除符號位)每位取反並+1 = 0000_1010

因為是無符號數,所以解釋成正數,也就意味著這樣的看似原碼的二進位制位就是補碼表示,也可以理解為符號位在第九位藏著乙個0.

這裡主要討論乙個細節:

134-246的計算過程→轉化為134+(-246)

最能體現底層的思路是這樣:

x-y = [x]補+[-y]補

因為[x]補就是1000_0110

[y]補 = 11110_0110

我們知道求[-y]補 就是將[y]補連同符號位每位求反加1

則結果就是:1000_0110 + 0000_1010 = 1001_0000 ==>90h

翻譯成無符號整數就是:144  =(256+)134-246

翻譯成有符號整數就是:-112  =134-246

所以怎麼算都不是-92,因此,這裡必須用底層的思路,這才是基本法。

一、短資料型別擴充套件為長資料型別

1、目標長資料型別有符號

符號位填充多出的位元組位(相比短資料型別多出的那一部分),保證擴充套件後的數值大小不變

1:char

10001001b; ? short

11111111

10001001b ;

2:char

00001001b; ? short

00000000

00001001b ;

2、目標長資料型別無號

用零來填充長資料型別的高位元組位

1:unsigned

char

10001001b; ? short

00000000

10001001b ;

2:unsigned

char

00001001b; ? short

00000000

00001001b ;

#include

intmain()

printf

("%d\n"

,j);

return0;

}請問該程式的輸出是多少?

unsigned

char

8位資料位,範圍0

-255,

前三次迴圈i=74

1第四次迴圈i=

-2(11111110)→溢位變成254

同理-1(11111111)時,溢位變成255;

最後減到0時,不滿足迴圈條件,for停止。

剛好173次。74

1==> 共(7-

1)/3

+1=3次(1-3

=-2,即254,繼續迴圈)

254251..

.52==

> 共(

254-2)

/3+1

=85次(2-3

=-1,即255,繼續迴圈)

255252..

.63==

> 共(

255-5)

/3+1

=85次(3-3

=0,退出迴圈)

所以總共173次。

C語言資料型別隱式轉換規則

c語言裡有各種資料型別,包含char,uchar,short,ushort,int,uint,long,ulong,float,double。每種數值型別能表達的值的範圍是不同的,而c c 的編譯器又允許這幾種型別之間進行混合運算,這就帶來了型別轉換問題。c語言隱式轉換規則簡單來說就是先進行整型提公...

C語言資料型別轉換

自動轉換發生在不同資料型別的量混合運算時,由編譯系統自動完成。自動轉換遵循以下規則 若參與運算量的型別不同,則先轉換成同一型別,然後進行運算。轉換按資料長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先把int量轉成long型後再進行運算。所有的浮點運算都是以雙精度進行的,即使僅...

C語言資料型別轉換

變數的資料型別是可以轉換的。轉換的方法有兩種,一種是自動轉換,一種是強制轉換。自動轉換發生在不同資料型別的量混合運算時,由編譯系統自動完成。自動轉換遵循以下規則 若參與運算量的型別不同,則先轉換成同一型別,然後進行運算。轉換按資料長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先...