Bir C uygulamasında (ör., Bir x86 C derleyicide) USHRT_MAX = 65535
ve INT_MAX = 2147483647
varsayalım. Öyleyse, aşağıdaki ifade iyi tanımlanmış mı? bir taşma meydana çünkü bu yüzden, (int
unsigned short
bütün olası değerleri temsil edebilir çünkü) her iki işlenen int
yükseltilirler C99 standart aşağıdaki göre veint promosyon: Aşağıdakiler iyi tanımlanmış mı?
unsigned short product = USHRT_MAX * USHRT_MAX;
, sonuç, iyi tanımlanmamıştır (
6.3.1.1-1
int ca ise:
65535^2 = 4294836225 > 2147483647
),product
değeri iyi tanımlanmış olmadığı anlamına gelir ki n orijinal türdeki tüm değerleri temsil eder; değer, int'ye dönüştürülen ; aksi halde, imzasız bir int'ye dönüştürülür. Bunlar tamsayı promosyonları olarak adlandırılır. (48) Diğer tüm türler tamsayı promosyonları tarafından değiştirilmeyen vardır.48) tam sayı promosyonlar sadece uygulanır:, tekli + ve işlenen için bir argüman ifadeler, her zamanki aritmetik dönüşüm parçası olarak -, ve • operatörler ve kaydırma iki işlenen için kendi alt bölümleri tarafından belirtildiği gibi operatörler. Negatif olmayan bir
6.2.5-9
aralığı: işaretsiz işlenen içeren hesaplamaları taşma yok çünkü
Bununla birlikte, aşağıdaki değerlere göre, sonuç, iyi tanımlı İmzalı bir tamsayı türünün değerleri, karşılık gelen imzasız tamsayı türünün bir alt kümedir ve gösteriminin her bir değerin aynı değeridir. (31) içeren bir hesaplamaişaretsiz işlenenler hiçbir zaman taşmayabilir, sonuçta elde edilen işaretsiz tamsayı türüyle temsil edilemeyen bir sonuç olmadığından, sonuç türü tarafından temsil edilen olabilen en büyük değerden büyük olan modulo .
yukarıda belirtilen açıklamada değişken product
iyi tanımlanmış bir değere sahip mi?
EDIT: Aşağıdaki durumda ne olması gerekir?
unsigned short lhs = USHRT_MAX;
unsigned short rhs = USHRT_MAX;
unsigned short product = lhs * rhs;
Ahlaki: aritmetik için "int" den daha küçük türleri kullanmayın, kurallar, fani programcıların doğru kodu yazmasına izin vermek için çok kafa karıştırıcıdır ... –
İki kod parçası arasında fark yoktur. Sabit ya da değişken kullanıp kullanmadığınızdan bağımsız olarak, 'int' için yapılan promosyonlar gerçekleşecektir. –
Sadece bir nitpick gibi, ilk durumda 'int' için * promosyon * yoktur. "USHRT_MAX" ifadesi verilen * bir * int'dir. '65535U' olarak bildirilecekse, resmin tamamı değişecektir. –