c语言char数字转int补位,关于char强制转换成int到底是用0还是用1补位的猜想与检验...
關于char強制轉換成int到底是用0還是用1補位的猜想與檢驗
最近學C語言發現char強制轉換時值會完全不同,而且變化很大,于是決定寫代碼測試一下。
先檢驗一下char型的-3和3在內存中分別怎么表示
——用到的函數
void PrintBit(char x)//用于輸出char型在內存中的二進制保存值
{
int i=0;
int n=sizeof(char)*CHAR_BIT;
int mask =1<
for(i=1;i<=n;i++)
{
putchar(!(x&mask)?'0':'1');
x<<=1;
if(!(i%CHAR_BIT)&&i
{
putchar(' ');
}
}
}
void InPrintBit(int x)//用于輸出int型在內存中的二進制保存值
{
int i=0;
int n=sizeof(int)*CHAR_BIT;
int mask =1<
for(i=1;i<=n;i++)
{
putchar(!(x&mask)?'0':'1');
x<<=1;
if(!(i%CHAR_BIT)&&i
{
putchar(' ');
}
}
}
——輸出的方式以及結果
char a=-3,b=3;
PrintBit(a);//輸出char a的二進制碼
printf("\n");
InPrintBit((int)a);//輸出int a的二進制碼
printf("\n");
PrintBit(b);//輸出char b的二進制碼
printf("\n");
InPrintBit((int)b); //輸出int b的二進制碼
從中發現可能負數前面補1正數前面補0,于是我猜想可能與強制轉換的類型有關。
——中途發現一件很神奇的事情
unsigned char a=-3是可以定義的,而且可以保存,并不報錯,明明說unsigned char不能表示負數的。
——更加神奇的是InPrintBit((int)a);再次輸出a時前面竟然補0了。
百度上說了這么一句話——無論是強制轉換或是自動轉換,都只是為了本次運算的需要而對變量的數據長度進行的臨時性轉換,而不改變數據說明時對該變量定義的類型。
也就是說可能 編譯器運行的時候只是對變量進行拷貝,就像java中的一樣,并不是直接用原數據進行計算。
換句話說——他只是把原數據提出來,然后按照想要的進行補位,如果原來的定義是unsigned,那么默認他就是無符號的,轉換成unsigned int 的時候就會補0。
——驗證猜想
unsigned char a=-3;
InPrintBit((int)a);
——再多變幾次
unsigned char a=-3;
InPrintBit((int)a);
printf("\n");
PrintBit((char)((int)a));//由unsigned char 變成int再變回char
printf("\n");
PrintBit(a);
毫無影響原來的值。
——最終猜想,值一直都是那個值,變化是根據原來的值的類型名來進行的變化。
——最終驗證
char a=-3;
printf("\n");
InPrintBit((unsigned int)((unsigned short int)a));
總結
由最終驗證明顯可以看出,強制類型轉換補0還是補1取決于原來變量的名字以及自身的值。
比如原本的char a=-3,自身是1111_1101如果此時把他轉換成unsigned short int,他補的就是1,如果轉換成unsigned short int再進一步轉換成unsigned int,他補的就是0。
如果之前是unsigned char a=-3,他竟然可以通過編譯不報錯,再次轉換的時候編譯器直接根據之前的unsigned判定他就是正數,于是直接補0。
寫在最后
本文毫無科學依據,只有實驗依據,如有誤,敬請批評指正。郵箱644360964@qq.com
總結
以上是生活随笔為你收集整理的c语言char数字转int补位,关于char强制转换成int到底是用0还是用1补位的猜想与检验...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言主范式与编码,超详细!终于搞明白K
- 下一篇: 为什么C语言exe能直接打开,怎么让c语