假設程式語言是C/C++。
一般而言結果是int型別。如果在某個編譯器上char被實現為unsigned char且長度與int相同,則結果會是unsigned int型別。
執行算術運算,首先對運算物件進行整型提升。所謂整型提升,即按如下規則型別轉換:
對於bool、(signed/unsigned) char、(unsigned) short等型別來說,只要它們所有可能的值都能存在int裡,它們就會提升成int型別;否則,提升成unsigned int型別。例如,兩個signed char相加,兩個signed char都會提升成int。
較大的char型別(wchar_t、char16_t、char32_t)提升成int、unsigned int、long、unsigned long、long long和unsigned long long中最小的能容納原型別所有可能的值的型別。
整型提升後,如果結果型別匹配,無需進一步的轉換。如果兩個(提升後的)運算物件都是帶符號的,或者都是無符號的,則小型別轉換成大型別。例如,int與long相加,結果是long。
如果一個運算物件是無符號型別,另一個運算物件是帶符號型別,又分兩種情況:
無符號的型別不小於帶符號的型別(比如unsigned long與int),此時帶符號的轉換成無符號的。例如原題中若char被實現為unsigned char且長度與int相同,則首先執行整型提升char被轉換為unsigned int(int不能容納char的所有可能值),然後int與unsigned int相加,int被轉換為unsigned int,最終結果為unsigned int。
無符號的型別小於帶符號的型別,此時結果依賴於機器。如果無符號型別的所有值都能存在該帶符號型別中,則無符號的轉換成帶符號的,否則帶符號的轉換成無符號的。
假設程式語言是C/C++。
一般而言結果是int型別。如果在某個編譯器上char被實現為unsigned char且長度與int相同,則結果會是unsigned int型別。
執行算術運算,首先對運算物件進行整型提升。所謂整型提升,即按如下規則型別轉換:
對於bool、(signed/unsigned) char、(unsigned) short等型別來說,只要它們所有可能的值都能存在int裡,它們就會提升成int型別;否則,提升成unsigned int型別。例如,兩個signed char相加,兩個signed char都會提升成int。
較大的char型別(wchar_t、char16_t、char32_t)提升成int、unsigned int、long、unsigned long、long long和unsigned long long中最小的能容納原型別所有可能的值的型別。
整型提升後,如果結果型別匹配,無需進一步的轉換。如果兩個(提升後的)運算物件都是帶符號的,或者都是無符號的,則小型別轉換成大型別。例如,int與long相加,結果是long。
如果一個運算物件是無符號型別,另一個運算物件是帶符號型別,又分兩種情況:
無符號的型別不小於帶符號的型別(比如unsigned long與int),此時帶符號的轉換成無符號的。例如原題中若char被實現為unsigned char且長度與int相同,則首先執行整型提升char被轉換為unsigned int(int不能容納char的所有可能值),然後int與unsigned int相加,int被轉換為unsigned int,最終結果為unsigned int。
無符號的型別小於帶符號的型別,此時結果依賴於機器。如果無符號型別的所有值都能存在該帶符號型別中,則無符號的轉換成帶符號的,否則帶符號的轉換成無符號的。