數(shù)據(jù)類型轉(zhuǎn)換一定會產(chǎn)生符號擴展嗎?
這里面有兩個基礎(chǔ)概念,第一個是強制類型轉(zhuǎn)換,第二個是符號擴展。
為什么要有類型轉(zhuǎn)換?
因為編譯器不能處理不同類型之間的運算。要么是兩個整數(shù)運算,要么是兩個浮點數(shù)運算,總之類型必須是一樣的。如果是一個整數(shù)和一個浮點數(shù)運算,那么要么把整數(shù)轉(zhuǎn)換位浮點數(shù),要么把浮點數(shù)轉(zhuǎn)換位整數(shù)。
類型轉(zhuǎn)換是啥樣子的?顯著特征就是賦值符號左右的兩個數(shù)據(jù)類型不一致
int a='m';
int b=(char)a;
?
什么是符號擴展,為什么要有符號擴展這件事情?
符號擴展就是把小存儲空間中的數(shù)據(jù)放到大存儲空間的時候,需要把大存儲空間多余的部分填充數(shù)據(jù),填充什么呢??就填充數(shù)據(jù)的符號位。
假設(shè)1100這是一個有符號的四位二進制位,符號位是1,轉(zhuǎn)換成八位二進制就是1111 1100
?假設(shè)0011這是一個有符號的四位二進制位,符號位是0,轉(zhuǎn)換成八位二進制就是0000 0011
那么,為什么要有符號擴展這個東西呢??符號擴展發(fā)生在數(shù)據(jù)類型轉(zhuǎn)換的時候,即,只要你看到?類似int b=(char)a;?這種轉(zhuǎn)換類型的時候就可能發(fā)生。類型轉(zhuǎn)換,我們是希望轉(zhuǎn)換前后的數(shù)據(jù)是相同的,如果不相同就不叫轉(zhuǎn)換了,叫改變。
抓換前是1100,轉(zhuǎn)換后是1111 1100?這兩個代表的真值是一樣的。
轉(zhuǎn)換前是0011,轉(zhuǎn)換后是0000 0011?這兩個代表的真值也是一樣的。
回到我們的問題,數(shù)據(jù)類型轉(zhuǎn)換一定會產(chǎn)生符號擴展嗎?
不一定的。比如把unsigned int?轉(zhuǎn)換為int?或者把int?轉(zhuǎn)換為unsigned int?都不會發(fā)生符號擴展,因為這兩種數(shù)據(jù)類型占用的空間是一樣的,只需要按照各自的格式讀寫數(shù)據(jù)就可以完成轉(zhuǎn)換。