Liczby oktalne, ósemkowe - bardzo dziwny problem, albo czegoś nie rozumiem

0

Przejrzałem dokumentacje i fora na temat zapisu oktalnego (ósemkowego) liczb w Visual Studio C# 2010.
U mnie wszystko zachowuje się bardzo dziwnie, żle interpretowane sąliczby oktalne.

// definiuję zmienną
byte L;

// pierwsze przypisanie liczby oktalnej 021 (17-decimal)
   L = 021;
// a w debugerze o widzę...  L=21
// 021 potraktowano jako dziesiętną a nie oktalną !!!

// jeszcze jedna próba 056 (46-decimal)
   L = 056;
// i co...  L=56, znowu źle !!!

Dlaczego????

dodanie znacznika <code class="csharp"> - fp

1

nie ma czegoś takiego w C#, jest w C++
wprowadzało to więcej pomyłek i zamieszania niż pożytku, nikt nie korzysta z ósemkowego kodu w kodzie
jeśli już musisz to użyj

Convert.ToInt32("21", 8) // 17

ciekawostka:
w javascript też już od tego odeszli z wersji na wersję

w starych przeglądarkach (i nowych IE):

parseInt('021'); // 17

w nowych przeglądarkach:

parseInt('021'); // 21

(ale samo 021 to nadal 17...)

1

Za ECMA-443 (C# 2.0)

9.4.4.2 Integer literals
Integer literals are used to write values of types int, uint, long, and ulong. Integer literals have two possible forms: decimal and hexadecimal.

W specyfikacji języka C# w wersji 5.0 jest nadal powiedziane to samo - są tylko dwie formy - dziesiętna i szesnastkowa. W C# nie ma zapisu ósemkowego.

1

A na co komu system ósemkowy? To ma realne zastosowanie tylko chyba w uprawnieniach plików pod Uniksami, a i tam jest to raczej denerwujące niż przydatne...

0

Kolego, używa się bardzo często zapisu ósemkowego.
Ja obecnie analizuje pakiety przesyłane w protokole ARINC i tu każda etykieta od zawsze opisywana była liczbą ósemkową i nadal tak jest.
W każdej dokumentacji amerykańskiej, dodam, że to są nowoczense technologie, używa się zapisu ósemkowego.

Co du użycia "Convert" to odpada nie można jej stosować w swich/case (tylko stałe)...

Niestety biedny ten Ms Visual C#
PS. Używałem już wielu kompilatorów i przyznam, że dopiero teraz natknąłem się na taką niedogodność. Kompilatory C/C++, nawet kompilatory na procesory 8-bitowe przyjmują zapis ósemkowy.

No bida z tym MVC#, panowie z Microsoftu rozleniwili się już na całego. Sam bym im napisał fragment analizujący liczby ósemkowe :)

2
belamy napisał(a):

No bida z tym MVC#, panowie z Microsoftu rozleniwili się już na całego.
Przecież to zupełnie inny język!? C# to nie jest nawet blisko C++

0
belamy napisał(a):

Co du użycia "Convert" to odpada nie można jej stosować w swich/case (tylko stałe)...

Oczywiście, że można.

No bida z tym MVC#, panowie z Microsoftu rozleniwili się już na całego. Sam bym im napisał fragment analizujący liczby ósemkowe :)

Serio?
Bo jak na razie, to nie potrafisz samodzielnie znaleźć rozwiązania prostego problemu, a ponadto jesteś zbyt leniwy na użycie wyszukiwarki.

0
somekind napisał(a):
belamy napisał(a):

Co du użycia "Convert" to odpada nie można jej stosować w swich/case (tylko stałe)...

Oczywiście, że można.

Proponuję zdradzić tajemnicę, może ktoś będzie szukał podobnego tematu, jak poprawnie wykorzystać Convert:

switch (L)
{
        case Convert.ToByte("021", 8):
              //.....
              break;

dodanie znaczników <code-csharp> - fp

1
belamy napisał(a):

Proponuję zdradzić tajemnicę, może ktoś będzie szukał podobnego tematu, jak poprawnie wykorzystać Convert:

switch (L)
{
        case Convert.ToByte("021", 8):
              //.....
              break;

dodanie znaczników <code-csharp> - fp

To chyba oczywiste, że wyrażenie może być tylko w switch, w case musi być stała, inaczej cała ta konstrukcja nie ma sensu.
W C++ jest tak samo, więc to nie C# jest biedny.

Przelicz sobie interesujące Cię wartości z oktalnego na dziesiętny zwykłym kalkulatorem i powstawiaj w case.

1 użytkowników online, w tym zalogowanych: 0, gości: 1