如果我寫一些東西像1 < < 8;什麼是它的默認類型。 默認情況下是未簽名還是簽名,或者我必須鍵入它嗎? 基本上我的問題是: 在C中涉及常量(正數)的表達式的類型是什麼(例如,2個例如13)? 每次我們需要對它進行類型轉換嗎?算術表達式的C語言中涉及到的內容
如果我想使用它(1 < < 8)作爲簽名類型轉換是強制性的? like short int x =(signed)(1 < < 8);
如果我寫一些東西像1 < < 8;什麼是它的默認類型。 默認情況下是未簽名還是簽名,或者我必須鍵入它嗎? 基本上我的問題是: 在C中涉及常量(正數)的表達式的類型是什麼(例如,2個例如13)? 每次我們需要對它進行類型轉換嗎?算術表達式的C語言中涉及到的內容
如果我想使用它(1 < < 8)作爲簽名類型轉換是強制性的? like short int x =(signed)(1 < < 8);
結果的類型與提升的左操作數的類型相同。 默認的整數簽名是經過簽名的,因此您的結果將默認進行簽名。
1)char有8位。您必須使1 < 7只設置第一位。
2)值是否有符號並不重要,位是相同的。 「=」左側的數據類型決定該值是否有符號。
你可以試試這個例子: 我不得不移動31次,因爲我的值被自動調用爲int。
#include <stdio.h>
int main() {
printf("size of int in Bytes: %d \n",sizeof(int)); //4
printf("my number: %d \n",1<<31); //-2147483648
printf("my number: %u \n",1<<31); //2147483648
return 0;
}
也許你可以研究這個理解%d和%U:printf reference
的1 << 8
結果的類型爲int
,但也可能有不同的類型,如果該1
是一個較大的值。
當源代碼有沒有後綴一個十進制數,它的類型是第一int
,long int
,或long long int
能夠代表值。由於這些類型的大小在不同的C實現中可能會有所不同,因此在不同的C實現中,數字的類型可能會有所不同。例如,在一個C實現中,65536
可以是int
,在另一個實現中可以是long int
。
按位移的結果具有(提升的)左操作數的類型。 (在表達式中使用時,促銷是不是與此有關,因爲每一個文字整數已經是從它的推廣效果的類型。但是,如果你有char x;
,然後x
將受到推動。)
因此,類型的1 << 8
是int
。
類型,促銷和按位移的交互可能會很麻煩。新手程序員可以使用1 << 31
來獲得第31位的值。然而,在許多C實現中,該表達式具有未定義的行爲,因爲在int
是32位的實現中,理想的數學結果int
不可表示。操作溢出,並且C標準沒有定義行爲。
由於這個原因,通常在按位移運算符和按位邏輯運算符中使用無符號值。代替1 << 31
,1u << 31
是優選的。
unsigned char x; … x << 24
發生了一個特別討厭的問題。在這裏,程序員認爲他們通過使用無符號類型來完成位操作。不幸的是,整數提升規則(在正常的C實現中)將unsigned char
轉換爲int
,而不是unsigned int
。因此,在x << 24
,x
成爲有符號整數,並且移位可能溢出,導致未定義的行爲。
因此,任何使用按位運算的程序員都必須學習整數提升規則和通用算術轉換,這些轉換在C標準中記錄在C 2011(N1570)6.3.1.1 2和6.3.1.8 1中。