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型運算時,先...