① 在c語言中長度相同的有符號與無符號整型數間,原樣賦值時為什麼值不同
在c語言中無符號(unsigned)和有符號(signed),數據范圍不同,無符號和有符號的區別就是有符號類型需要使用一個bit來表示數字的正負,從而導致負數或者超過signed int數據范圍時,在兩者中的表示值不同,示例代碼如下,
#include <stdio.h>
int main(int argc, char *argv[])
{
unsigned a;
int b=-1;
a=b;
printf("%d %d-> %u\n",sizeof(int),b,a);//輸出-1 -> 4294967295(0Xffffffff,-1的補碼)
a=2147683648;//0X80000000(-2147683648的補碼)
b=a;
printf("%d -> %u\n",b,a);//輸出-2147683648 -> 2147683648
return 0;
}
win32平台下,無符號(unsigned)和有符號(signed)int都佔用4個位元組,數值范圍如下,
有符號int:-2147683648 到2147683647(- 2^31 到2^31- 1);
無符號int:0到4294967295(0 到2^32 - 1);
無符號類型int能保存2倍於有符號類型的正整數數據,多1個bit位。正數的補碼就是其自身,負數的補碼是在其原碼的基礎上, 保持符號位不變, 其餘各位求反(反碼),最後+1(即在反碼的基礎上+1)。
② C語言中char類型中的有符號與無符號的區別和意義
在C中,默認的基礎數據類型均為signed,現在我們以char為例,說明(signed) char與unsigned char之間的區別。
首先在內存中,char與unsigned char沒有什麼不同,都是一個位元組,唯一的區別是,char的最高位為符號位,因此char能表示-127~127,unsigned char沒有符號位,因此能表示0~255,這個好理解,8個bit,最多256種情況,因此無論如何都能表示256個數字。
在實際使用過程種有什麼區別呢?主要是符號位,但是在普通的賦值,讀寫文件和網路位元組流都沒什麼區別,反正就是一個位元組,不管最高位是什麼,最終的讀取結果都一樣,只是你怎麼理解最高位而已,在屏幕上面的顯示可能不一樣。
二者的最大區別是:但是我們卻發現在表示byte時,都用unsigned char,這是為什麼呢?首先我們通常意義上理解,byte沒有什麼符號位之說,更重要的是如果將byte的值賦給int,long等數據類型時,系統會做一些額外的工作。如果是char,那麼系統認為最高位是符號位,而int可能是16或者32位,那麼會對最高位進行擴展(注意,賦給unsigned int也會擴展)而如果是unsigned char,那麼不會擴展。最高位若為0時,二者沒有區別,若為1時,則有區別了。同理可以推導到其它的類型,比如short, unsigned short,等等。
具體可以通過下面的小例子看看其區別
include <stdio.h>
void f(unsigned char v)
{
char c = v;
unsigned char uc = v;
unsigned int a = c, b = uc;
int i = c, j = uc;
printf("----------------
");
printf("%%c: %c, %c
", c, uc);
printf("%%X: %X, %X
", c, uc);
printf("%%u: %u, %u
", a, b);
printf("%%d: %d, %d
", i, j);
}
int main(int argc, char *argv[])
{
f(0x80);
f(0x7F);
return 0;
}
結果輸出如下:
結果分析:
對於(signed)char來說,0x80用二進製表示為1000 0000,當它作為char賦值給unsigned int或 int 時,系統認為最高位是符號位,會對最高位進行擴展。而0x7F用二進製表示為0111 1111,最高位為0,不會擴展。
對於unsigned char來說,不管最高位是0,還是1,都不會做擴展。
③ 在C語言中11種賦值運算符的具體含義,用法
1.=
賦值運算符
變數=表達式
如:a=3;將a的值賦為3
2./=
除後賦值
變數/=表達式
如:a/=3;即a=a/3
3.*=
乘後賦值
變數*=表達式
如:a*=3;即a=a*3
4.%=
取模後賦值
變數%=表達式
如:a%=3;即a=a%3
5.+=
加後賦值
變數+=表達式
如:a+=3;即a=a+3
6.-=
減後賦值
變數-=表達式
如:a-=3;即a=a-3
7.<<=
左移後賦值
變數<<=表達式
左移就是將《左邊的數的二進制各位全部左移若干位,《右邊的數指定移動位數,高位丟棄,低位補0,
移幾位就相當於乘以2的幾次方
8.>>=
右移後賦值
變數>>=表達式
右移運算符是用來將一個數的各二進制位右移若干位,移動的位數由右操作數指定(右操作數必須是非負值),移到右端的低位被舍棄,對於無符號數,高位補0。對於有符號數,某些機器將對左邊空出的部分用符號位填補(即「算術移位」),而另一些機器則對左邊空出的部分用0填補(即「邏輯移位」)。注意:對無符號數,右移時左邊高位移入0;對於有符號的值,如果原來符號位為0(該數為正),則左邊也是移入0。如果符號位原來為1(即負數),則左邊移入0還是1,要取決於所用的計算機系統。有的系統移入0,有的
系統移入1。移入0的稱為「邏輯移位」,即簡單移位;移入1的稱為「算術移位」。
9.&=
按位與後賦值
變數&=表達式
按位與是指:參加運算的兩個數據,按二進制位進行「與」運算。如果兩個相應的二進制位都為1,則該位的結果值為1;否則為0。這里的1可以理解為邏輯中的true,0可以理解為邏輯中的false。按位與其實與邏輯上「與」的運算規則一致。邏輯上的「與」,要求運算數全真,結果才為真。若,A=true,B=true,則A∩B=true
10.
^=
按位異或後賦值
變數^=表達式
參與運算的兩個量按照對應的位進行異或運算,且
0^0→0,
0^1→1,
1^0→1,
1^1→0
此外,一個數與0異或仍保持不變,即a^0=a
一個數與自己異或結果為0,即a^a=0
11.|=
按位或後賦值
變數|=表達式
參與運算的兩個量按照對應位進行或運算,且
0|0→0,
0|1→1,
1|0→1,
1|1→1
這些位運算都是與二進制碼有關的,所以多弄弄也就會了
④ C語言 賦值問題:為什麼有符號賦值給無符號錯誤呢
a的定義不全,是INT還是float的,規范的寫法是unsigned int a;
同時,unsigned定義的是無符號位元組型,然後你又把-1賦值給a,那麼你最後輸出的結果,肯定是a=65535,0-65535的最大值
⑤ C語言中 無符號變數的值賦給有符號的變數
無符號變有符號數,只要有符號數的數據的正數范圍比無符號的范圍大於或等於即可不會遇到+
-符號的問題,能得到想要的結果。但是有符號數轉無符號數就存在正負號問題。要是保證有符號數據直接轉成無符號數,存在著正負號問題
⑥ c語言 關於有符號、無符號和補碼、原碼
在C語言中:只有十進制數有符號,八進制和十六進制沒有的,一個數的原碼是其二進制數,補碼是對原碼取反後再加上1,
比如: 5則原碼是 101,則反碼是010,補碼=010+1=011
⑦ C語言中的有符號和無符號是什麼意思給仔細講講
有符號數 有符號數的實例
有符號數是針對二進制來講的。 用最高位作為符號位,「0」代表「+」,「1」代表「-」;其餘數位用作數值位,代表數值。 有符號數的表示:計算機中的數據用二進製表示,數的符號也只能用0/1表示。一般用最高有效位(MBS)來表示數的符號,正數用0表示,負數用1表示。 有符號數的編碼方式,常用的是補碼,另外還有原碼和反碼等。用不同二進制編碼方式表示有符號數時,所得到的機器數可能不一樣,但是真值應該是相同的。
無符號數【網路.網路搜索】
無符號數是針對二進制來講的,無符號數的表數范圍是非負數。全部二進制均代表數值,沒有符號位。即第一個"0"或"1"不表示正負。 無符號數與有符號數相對
C支持所有整形數據類型的有符號數和無符號數運算。盡管C標准並沒有指定某種有符號數的表示,但是幾乎所有的機器都使用二進制補碼。通常,大多數數字默認都使有符號的,C也允許無符號數和有符號數之間的轉換,轉換原則是基本的位表示保持不變。因此在一台二進制補碼機器上,當從無符號數轉換為有符號數時,效果就是應用U2Tw,而從有符號轉換為無符號數時,就是應用函數T2Uw,其中w表示數據類型的位數。T2Uw(x) = (x<0)?(x+2w) :x;U2Rw(x) = (x<2w-1)?x:(x-2w); 當執行一個運算時,如果它的一個運算數是有符號的而另一個是無符號的,那麼C會隱含地將有符號參數強制轉換為無符號數,並假設這兩個數都是非負的,來執行這個運算。
⑧ 在C語言中11種賦值運算符的具體含義,用法
1.六個變數=表達式的賦值:
=是賦值運算符,/=是除後賦值,*=是乘後賦值,
%=是取模後賦值,+=是加後賦值,-= 是減後賦值,
2.<<=是左移後賦值,變數<<=表達式 左移就是將左邊的數的二進制各位全部左移若干位,右邊的數指定移動位數,高位丟棄,低位補0, 移幾位就相當於乘以2的幾次方。
3.>>=是右移後,變數>>=表達式,右移運算符是用來將一個數的各二進制位右移若干位,移動的位數由右操作數指定(右操作數必須是非負值),移到右端的低位被舍棄,對於無符號數,高位補0。
對於有符號數,某些機器將對左邊空出的部分用符號位填補(即「算術移位」),而另一些機器則對左邊空出的部分用0填補(即「邏輯移位」);
對無符號數,右移時左邊高位移入0;對於有符號的值,如果原來符號位為0(該數為正),則左邊也是移入0。
如果符號位原來為1(即負數),則左邊移入0還是1,要取決於所用的計算機系統,系統移入0或系統移入1。
移入0的稱為「邏輯移位」,即簡單移位;移入1的稱為「算術移位」。
4.&= 按位與後,變數&=表達式,按位與是指:參加運算的兩個數據,按二進制位進行「與」運算。
如果兩個相應的二進制位都為1,則該位的結果值為1;否則為0。
5.^= 按位異或後賦值,變數^=表達式,參與運算的兩個量按照對應的位進行異或運算,且
0^0→0, 0^1→1, 1^0→1, 1^1→0
一個數與0異或仍保持不變,如a^0=a
一個數與自己異或結果為0,如a^a=0
11.|=是按位或後賦值,變數|=表達式,參與運算的兩個量按照對應位進行或運算,且0|0→0, 0|1→1, 1|0→1, 1|1→1。
(8)c語言有符號和無符號賦值擴展閱讀:
1.賦值表達式的功能是計算表達式的值再賦予左邊的變數。
賦值運算符具有右結合性,因此a=b=c=5可理解為a=(b=(c=5))。
2.在其它高級語言中賦值構成了一個語句,稱為賦值語句;
而在C語言中,
把「=」定義為運算符,從而組成賦值表達式。
3.凡是表達式可以出現的地方均可出現賦值表達式。
例如:式子x=(a=5)+(b=8)是合法的。它的意義是把5賦予a,8賦予b,再把a,b相加,和賦予x,故x應等於13。
4.在C語言中也可以組成賦值語句。
按照C語言規定,任何錶達式在其未尾加上分號就構成為語句。
⑨ C語言中 無符號變數的值賦給有符號的變數
無符號變有符號數,只要有符號數的數據的正數范圍比無符號的范圍大於或等於即可不會遇到+ -符號的問題,能得到想要的結果。但是有符號數轉無符號數就存在正負號問題。要是保證有符號數據直接轉成無符號數,存在著正負號問題
⑩ C語言中 無符號變數的值賦給有符號的變數
用強制轉換。
unsigned 變 long,short, 數值可能超界,就會得到不正確的結果,需要仔細處理。
正如 double 變 int 數值可能超界,需要仔細處理。
unsigned long int a=0xa900;
long b;
short c;
b = (long) a;
printf("%d\n",b);
c = (short) a;
printf("%d\n",c);