❶ c語言強制類型轉換結果問題
i&0xff,意思是取出i的低8位數據。所以
value=(unsignedchar)(i&0xff);//意思是取出i的低8位並轉換成無符號字元型,賦值給value。
12345,轉換成16進制,結果為0x3039,所以,高8位的值為0x30,低8位的值為0x39,所以轉換賦值之後,value的值就是0x39。
printf("%d ",value);//把value按%d即10進制有符號輸出,16進制39轉換成10進制,就是57,所以,輸出57。
❷ 請教:C語言強制類型轉換無法改變數據符號
c1是單位元組,你輸出時轉為unsigned int,這是32位的,就是FFFFFFFF而不是FF,輸出時格式為有符號十進制數,32位最高位為1,當然為-1,你要16位就用short。
串口輸入用byte(unsigned char),接收後隨便你怎麼玩.
❸ C語言強制類型轉換
強制類型轉換是把變數從一種類型轉換為另一種數據類型。
例如,如果想存儲一個long類型的值到一個簡單的整型中,需要把long類型強制轉換為int類型。可以使用強制類型轉換運算符來把值顯式地從一種類型轉換為另一種類型。
發生在同一個編譯系統中,比如說把int轉化為longint,在VC++6.0裡面,longint和int都是4個位元組,不會有問題的,但是如果把int類型轉化為short類型那就裝不下了,簡而言之就是長類型不能轉化為短類型。
int類型如果要轉化為float、double、longdouble類型的時候只是末尾多了幾個0,但是反之轉化,就會出現數據的損失,小數部位都被省略掉了。
賦值中的類型轉換
當賦值運算符兩邊的運算對象類型不同時,將要發生類型轉換, 轉換的規則是:把賦值運算符右側表達式的類型轉換為左側變數的類型。
由於C語言中的浮點值總是用雙精度表示的,所以float 型數據只是在尾部加0延長為double型數據參加運算,然後直接賦值。double型數據轉換為float型時,通過截尾數來實現,截斷前要進行四捨五入操作。
以上內容參考:網路-C語言類型強制轉換
❹ C語言類型強制轉換的注意事項
1.類型說明符和表達式都必須加括弧(單個變數可以不加括弧),如把(int)(x+y)寫成(int)x+y則成了把x轉換成int型之後再與y相加了。
2.無論是強制轉換或是自動轉換,都只是為了本次運算的需要而對變數的數據長度進行的臨時性轉換,而不改變數據說明時對該變數定義的類型。
例1:
main()
{
float f=5.75;
printf(f=%d,f=%f
,(int)f,f);
}
f=5,f=5.750000
將float f強制轉換成int f float f=5.75;printf((int)f=%d,f=%f
,(int)f,f); 本例表明,f雖強制轉為int型,但只在運算中起作用, 是臨時的,而f本身的類型並不改變。因此,(int)f的值為 5(刪去了小數)而f的值仍為5.75。
例2:
比如我們可以(int)'A',這樣轉換後的結果為A的ASCII碼數值,因為那塊內存本來就存的那個數,只是換個形式使用而已。 知道上面的原則,我們可以對任何數據類型進行轉換,但是轉換的結果可能不是你想像的結果,舉例(int)'9'的結果為多少?不是9而是0x39。來個高深點的printf(%d,『12』);的輸出是什麼?正確答案是12594,因為printf(%d,'12'),列印的是存儲12的內存地址上的內容,即ASCII碼值2存儲在低位,1儲在高位地址,0x32就是2的ASCII碼,0x31就是1的ASCII碼,所以是0x3132,轉換成10進制就是12594!
● 字元型變數的值實質上是一個8位的整數值,因此取值范圍一般是-128~127,char型變數也可以加修飾符unsigned,則unsigned char 型變數的取值范圍是0~255(有些機器把char型當做unsighed char型對待, 取值范圍總是0~255)。
● 如果一個運算符兩邊的運算數類型不同,先要將其轉換為相同的類型,即較低類型轉換為較高類型,然後再參加運算,轉換規則如下圖所示。
double ←── float 高
↑
long
↑
unsigned
↑
int ←── char,short 低
● 圖中橫向箭頭表示必須的轉換,如兩個float型數參加運算,雖然它們類型相同,但仍要先轉成double型再進行運算,結果亦為double型。 縱向箭頭表示當運算符兩邊的運算數為不同類型時的轉換,如一個long 型數據與一個int型數據一起運算,需要先將int型數據轉換為long型, 然後兩者再進行運算,結果為long型。所有這些轉換都是由系統自動進行的, 使用時你只需從中了解結果的類型即可。這些轉換可以說是自動的,當然,C語言也提供了以顯式的形式強制轉換類型的機制。
● 當較低類型的數據轉換為較高類型時,一般只是形式上有所改變, 而不影響數據的實質內容, 而較高類型的數據轉換為較低類型時則可能有些數據丟失。
賦值中的類型轉換
當賦值運算符兩邊的運算對象類型不同時,將要發生類型轉換, 轉換的規則是:把賦值運算符右側表達式的類型轉換為左側變數的類型。具體的轉換如下:
(1) 浮點型與整型
● 將浮點數(單雙精度)轉換為整數時,將舍棄浮點數的小數部分, 只保留整數部分。將整型值賦給浮點型變數,數值不變,只將形式改為浮點形式, 即小數點後帶若干個0。注意:賦值時的類型轉換實際上是強制的。
(2) 單、雙精度浮點型
● 由於C語言中的浮點值總是用雙精度表示的,所以float 型數據只是在尾部加0延長為double型數據參加運算,然後直接賦值。double型數據轉換為float型時,通過截尾數來實現,截斷前要進行四捨五入操作。
(3) char型與int型
● int型數值賦給char型變數時,只保留其最低8位,高位部分舍棄。
● char型數值賦給int型變數時, 一些編譯程序不管其值大小都作正數處理,而另一些編譯程序在轉換時,若char型數據值大於127,就作為負數處理。對於使用者來講,如果原來char型數據取正值,轉換後仍為正值;如果原來char型值可正可負,則轉換後也仍然保持原值, 只是數據的內部表示形式有所不同。
(4) int型與long型
● long型數據賦給int型變數時,將低16位值送給int型變數,而將高16 位截斷舍棄。(這里假定int型占兩個位元組)。 將int型數據送給long型變數時,其外部值保持不變,而內部形式有所改變。
(5) 無符號整數
● 將一個unsigned型數據賦給一個占據同樣長度存儲單元的整型變數時(如:unsigned→int、unsigned long→long,unsigned short→short) ,原值照賦,內部的存儲方式不變,但外部值卻可能改變。
● 將一個非unsigned整型數據賦給長度相同的unsigned型變數時, 內部存儲形式不變,但外部表示時總是無符號的。
/*例:賦值運算符舉例 */
main()
{
unsigned a,b;
int i,j;
a=65535;
i=-1;
j=a;
b=i;
printf((unsigned)%u→(int)%d
,a,j);printf((int)%d→(unsigned)%u
,i,b);
}
運行結果為:(unsigned)65535→(int)-1(int)-1→(unsigned)65535
● 計算機中數據用補碼表示,int型量最高位是符號位,為1時表示負值,為0時表示正值。如果一個無符號數的值小於32768則最高位為0,賦給 int型變數後、得到正值。如果無符號數大於等於32768,則最高位為1, 賦給整型變數後就得到一個負整數值。反之,當一個負整數賦給unsigned 型變數時,得到的無符號值是一個大於32768的值。
● C語言這種賦值時的類型轉換形式可能會使人感到不精密和不嚴格,因為不管表達式的值怎樣,系統都自動將其轉為賦值運算符左部變數的類型。
● 而轉變後數據可能有所不同,在不加註意時就可能帶來錯誤。 這確實是個缺點,也遭到許多人們批評。但不應忘記的是:c語言最初是為了替代匯編語言而設計的,所以類型變換比較隨意。當然, 用強制類型轉換是一個好習慣,這樣,至少從程序上可以看出想干什麼。
❺ c語言指針強制類型轉換
一個指針做算數加減的時候,字面上的加一或者減一,實際增加或者減少的值是其指向類型的空間大小
也就是說,p+1,實際增長的值是sizeof(*p)
所以,將p轉為int*後,加10,實際增加是10*sizeof(int)也就是40
而如果是p+2,由於p是char*,實際增加的是2*sizeof(char)=2
❻ C語言數據強制類型轉換
#include<stdio.h>
void main()
{
double x=3;
x=(double)(x+1.999);
printf("%.3lf\n",(double)x);
}
❼ C語言中類型強制轉換後數據存儲位變化後,存儲空間地址如何變化
強制類型轉換只改變數據的處理方式,無論地址和地址內存儲的內容,都不會發生任何改變
❽ c語言強制類型轉換
1、int a;int b;double c = (double) a;double c = (double) b;int a = (int) c;這就是一種強制轉變方法。
❾ c語言中強制類型轉換後原變數值和數據類型不變 對嗎
強制類型轉換是把變數從一種類型轉換為另一種數據類型。
這話完全正確。
例如,如果您想存儲一個 long 類型的值到一個簡單的整型中,您需要把 long 類型強制轉換為 int 類型。您可以使用強制類型轉換運算符來把值顯式地從一種類型轉換為另一種類型。但這只適用於本次使用,原變數的類型及其中的值都不會發生變化。
(9)c語言強制類型轉換後數據超了擴展閱讀:
舉例說明
使用強制類型轉換運算符把一個整數變數除以另一個整數變數,得到一個浮點數:
#include <stdio.h>int main()
{
int sum = 17, count = 5;
double mean;
mean = (double) sum / count;
printf("Value of mean : %f\nsum=%d\n", mean ,sum);
}
當上面的代碼被編譯和執行時,它會產生下列結果:
Value of mean : 3.400000
sum=17