W poniższym kodzie:typ danych promocja w C
#include "stdio.h"
signed char a= 0x80;
unsigned char b= 0x01;
void main (void)
{
if(b*a>1)
printf("promoted\n");
else if (b*a<1)
printf("why doesnt promotion work?");
while(1);
}
się spodziewałem „promowane” do wydrukowania Ale to nie robi Dlaczego Jeśli mogę się datatypes podpisanych i unsigned int i mają jak..? liczbą ujemną, np 0x80000000 i b jako liczbę dodatnią, 0x01 „promowane” zostanie wydrukowane zgodnie z oczekiwaniami.
PLZ pomóż mi zrozumieć czym jest problem!
@Mystical Nie rozumiem twojej odpowiedzi. Nawet jeśli zostanie podpisany rozszerzony na typ int, co nie wydaje mi się, że to robi, ale zakładając, że tak jest, dlaczego nie jest promowany do unsigned int, a produkt jest liczbą + ve? – Dom045
+1 - Ta odpowiedź jest znacznie lepsza/ważniejsza niż moja przez długą milę (więc ją usunąłem) –
@ Dom045 Ponieważ specyfikacja mówi tak. Zarówno 'signed char' i' unsigned char' są niższymi typami niż 'int'. Więc oboje zostaną awansowani do "int". W przypadku 'signed int' vs.' unsigned int' standard podaje, że oba są konwertowane na 'unsigned int'. Reguły można znaleźć tutaj: https://www.securecoding.cert.org/confluence/display/seccode/INT02-C.+Understand+integer+conversion+rules – Mysticial