Po co używać przedrostka L skoro domyślnie typ jest rozszerzony (no bo mamy wcout i wchar_t). Czy coś się zmieni gdy go nie dam?
Domyślnie typ nie jest rozszerzony. Zerknij do tego posta, są tutaj fajnie wypisane typy stałych w C++: https://stackoverflow.com/a/13087264/7470787
Pisząc wchar_t c = 'a' ten pojedynczy znak, po prawej stronie znaku przypisania jest typu char. Jako że chcesz przypisać char do wchar_t, to zachodzi niejawna konwersja tej stałej do typu wchar_t i następuje przypisanie. Podobnie jest z zapisem float f = 3.0 - 3.0 jest typu double, chcemy je wpisać do float-a, więc musi zajść konwersja.
Czy zapiszesz wchar_t c = 'a' czy wchar_t c = L'a' i tak w zmiennej c zostanie przechowana wartość równa L'a' :) Będzie różnica, jeżeli użyłbyś np. typu auto. Czyli auto c = 'a' - tutaj c dostaje typ char, bo taki jest typ stałej 'a'. Inaczej w przypadku auto c = L'a', w tym przypadku c będzie typu wchar_t.
short val = 100ULL;
Jak możemy tu dać unsigned long long int skoro zmienna jest o wiele mniejsza... A to błędu kompilacji nie powoduje.
Tutaj do zmiennej val typu short chcesz wpisać stałą unsigned long long. Nie ma w tym niczego złego, w C++ można takie rzeczy robić. W takiej sytuacji zostanie wpisane tyle najmniej znaczących bitów ile się da, reszta zostanie zignorowana. Ostrzeżenie od kompilatora dostaniesz, jak spróbujesz do short-a wpisać liczbę, która się tam nie ma szans zmieścić np. 1000000ULL. Będzie to jednak tylko ostrzeżenie, program się skompiluje i będzie się zachowywał tak, że ten milion zostanie obcięty do 16-bitów, czyli do wartości 16960 i taka wartość znajdzie się w zmiennej typu short.