• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

typ wchar_t i literały liczbowe w C++

Object Storage Arubacloud
+2 głosów
2,447 wizyt
pytanie zadane 21 listopada 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

Hej, uczę się z książki C++, Szkoła Programowania. Mam kilka pytań odnośnie rozdziału poświęconego danym:

1) typ wchar_t

Mamy sobie jakiś znak rozszerzony:

wchar_t = L'A';

albo:

wcout<<L"Hello";

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?

2) Określanie typu stałej

mamy coś takiego:

cout<<1914ULL;

Zapisze się ona jako unsigned long long int

jak rozumieć to:

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.

 

Dziękuje wam serdecznie za pomoc i pozdrawiam ;)

2 odpowiedzi

+2 głosów
odpowiedź 22 listopada 2017 przez Piotr Batko Stary wyjadacz (13,190 p.)
wybrane 22 listopada 2017 przez Jakub 0
 
Najlepsza

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.

komentarz 22 listopada 2017 przez Jakub 0 Pasjonat (23,120 p.)
edycja 22 listopada 2017 przez Jakub 0

nic już z tego nie rozumiem ;( :

wchar_t x = '私';
wcout << x << endl;

Teraz już nic mi się wyświetla pytajnik...

wchar_t x = L'私'; 
wcout << x << endl;

A teraz nic

char32_t x = U'私';
cout << x << endl; //co innego

char32_t x = U'私';
cout << x << endl; //jeszcze co innego

 

Mało mnie te systemy kodowania interesują, ale chyba trzeba to wiedzieć

1
komentarz 23 listopada 2017 przez Piotr Batko Stary wyjadacz (13,190 p.)

Prawdopodobnie nie bierzesz pod uwagę różnych stron kodowych w konsoli i edytorze. Fajnie omówił to Pan Mirosław w tym filmie: https://www.youtube.com/watch?v=9SnZMDONhFU

A co do tego, że u Ciebie ten dziwny znaczek wyświetla się za każdym razem w inny sposób: '私' jest typu int i ma u mnie wartość 15 181 697. Wniosek wysnułem na podstawie tego kodu:

std::cout << '私' << std::endl;

Podczas kompilacji dostaję warninga multi-character character constant [-Wmultichar]. To jest ostrzeżenie odnośnie tego piekielnego znaczka. Jeżeli chcesz się w temat zgłębić, to polecam zacząć poszukiwania od wklejenia tego warninga w google. Ja się z tym spotkałem po raz pierwszy w życiu, więc tutaj się nie powymądrzam :)

Do tego momentu dzieje się trochę dziwnych rzeczy, ale dalej już jest "po staremu" :) 

  •  '私' jest typu int i ma wartość 15 181 697
  • L'私' jest typu wchar_t, więc 15 181 697 zostaje ciachnięte do 16-bitów (dostaniesz w tym momencie jakiś inny znak)
  • U'私' jest typu char32_t, więc jako że 15 181 697 mieści się na tych 32-bitach, zostanie zachowana bez zmian

Jeżeli przypisujesz powyższe wartości do zmiennych, to mogą one zostać ciachnięte. Np: char c = U'私' - po prawej stronie znaku przypisania masz pełną, 32-bitową informację o znaku, ale przypisujesz go do 8-bitowej zmiennej. To co się nie zmieściło jest ignorowane. W zmiennej c siedzi teraz jakiś zupełnie inny znak.

komentarz 23 listopada 2017 przez Jakub 0 Pasjonat (23,120 p.)
Dzięki, szczerze mówiąc systemy kodowania znaków mało mnie interesują. Czy na razie taka wiedza mi wystarczy (tzn wiedzieć tylko że istnieje coś takiego jak wchar itd...) ?
1
komentarz 23 listopada 2017 przez Piotr Batko Stary wyjadacz (13,190 p.)
Jak będziesz robił jakieś wielojęzyczne aplikacje, to będziesz potrzebował głębszej wiedzy w zakresie tych całych kodowań i szerokich znaków. Jeżeli dopiero zaczynasz przygodę z programowaniem, to nie zawracaj sobie tym zbytnio głowy. Ważne, żebyś wiedział co to ASCII :) No i ważne, żebyś rozumiał te rzutowania/konwersje o których się rozpisywałem powyżej :)
+1 głos
odpowiedź 22 listopada 2017 przez obl Maniak (51,280 p.)

Usuń to L i spróbuj skompilować program. W C++

char sign = 'A'; // oznacza 8-bitowy znak
char string[] = "some text"; // ciąg ośmiobitowych znaków tekstowych

więc dla odróżnienia konieczne było wprowadzenie dodatkowego znacznika w postaci literki L bo wchar_t jest 16-bitowe.

Co do drugiego, to załóżmy, że masz dwie liczby całkowite bez znaku a i b , gdzie a jest 8-bitowa, b 32-bitowa i b = 256(d) = 1 0000 0000(b) to operacja a = b = 0000 0000 ponieważ do zmiennej a przepisywane jest tylko pierwszych 8-bitów reszta idzie w niepamięć. Dlatego mówi się często w programowaniu w takich sytuacjach o przekręceniu licznika.

Podobne pytania

0 głosów
0 odpowiedzi 84 wizyt
pytanie zadane 28 grudnia 2018 w Assembler przez Ptaszor3 Użytkownik (900 p.)
+1 głos
1 odpowiedź 297 wizyt
pytanie zadane 5 listopada 2015 w C i C++ przez krzakurts Obywatel (1,470 p.)
0 głosów
1 odpowiedź 1,476 wizyt

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...