Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

Bars1967 avatar Bars1967 9 Точки

относно отрицателните числа

Как C# "вижда" отрицателно число?

Не говоря за бинарен код, имам предвид число от типа "-134", примерно.

Открих, че ако по този начин го запиша в код, програмата не го приема като по-малко от 0.

Не ми се стори логично първо да се преобразува в двоичен код, затова реших да попитам.

 

0
Programming Basics
Filkolev avatar Filkolev 4482 Точки

Я дай конкретен код, че не мога да разбера какъв е проблемът.

0
Bars1967 avatar Bars1967 9 Точки

Мислек, че късно съм задал въпроса и едва ли има някой буден, ако знаех, че има - щях да изчакам отговорите :)

Ето го кода

 

static void Main()

{

Console.Write("Enter a character: ");

long ch = (long)Console.Read();

if (ch < 0) //if ch is negative

{

Console.WriteLine("The value is a negative");

}

 

}

Искам да въведа отрицателно число и да получа отговор, че е отрицателно.

Но явно при четенето не приема "-" за минус

 

0
07/07/2015 07:18:24
Filkolev avatar Filkolev 4482 Точки

Console.Read() чете само един символ и го обръща в ASCII код, няма как с този метод да хванеш числото -134. Трябва да ползваш Console.ReadLine() и след това да парснеш с long.Parse например.

0
RoYaL avatar RoYaL Trainer 6849 Точки

Да не би да ползваш тип данни, който не позволява отрицателни стойности? Защото не ти вярвам в противен случай:)

0
mgulubov avatar mgulubov 73 Точки

C# вижда -134 като стойност от signed числов тип, по-голям от 8 бита. Свежда си го до бинарен код, точно както в C, което е и най-практичния начин, за моментната технология :).

И на мен ми стана интересно, как точно успяваш да компилираш и изпълниш код, в който -134 да не е по-малко от 0 :). Аз лично, се сещам единствено за нещо такова:

uint someInt = 0;

someInt -= 134;

Само че, в този случай, someInt няма да е равно на -134, а ще е 4294967162, понеже реално превърташ uint-a и след нула започваш от uint.MaxValue, което е 4294967295. С останалите unsigned типове, ще е абсолютно същото.

0
Bars1967 avatar Bars1967 9 Точки

Хехе, значи сега ще научиш още един начин  :)
При това - не дава грешка в кода, просто не приема "-" за "минус".
А типа данни би трябвало да си го вижда нали е от -9,223,372,036,854,775,808  до 9,223,372,036,854,775,807 ?

0
Bars1967 avatar Bars1967 9 Точки

Така.
Сега пийнах малко кафе и мисълта ми си тръгна малко по-така

Реших да малко да потествам

{

Console.Write("Enter a character: ");

long ch = (long)Console.Read();

{

Console.WriteLine(ch);

}

 

При въведено -4, ми връща отговор 45

Неведоми са пътищата...

Вероятно си има теоретично обяснение.
Интересува ме практическото.

0
07/07/2015 09:02:28
Bars1967 avatar Bars1967 9 Точки

При ето това

long ch = Console.Read();

ch = (ch * -1);

 

{

Console.WriteLine(ch);

}

получих -45 - демек вече вижда нещо отрицателно, но не е -4

Някакъв тип, който да не ми преобразува -4 в 45, а да си го приеме като -4?

 

Така

long ch = -4;

if (ch < 0)

 

{

Console.WriteLine(ch);

}

всичко е точно.
Излиза, че проблемът е в Console.Read() - просто не ми прочита отрицателното число.

Някаква идея.. преди да съм му намерил решението :)

Добре, успях да получа нещо

Console.Write("Enter a character: ");

long ch = long.Parse(Console.ReadLine());

if (ch < 0)

 

{

Console.WriteLine(ch);

}

Благодаря за помоща на всички.
Дано сте успели да си починете днес.

0
07/07/2015 08:14:41
mgulubov avatar mgulubov 73 Точки

Проблема не е в Console.Read(). Проблема е, че ползваш Console.Read() неправилно :). Ще обясня:

Console.Read() взима следващия character, от input stream-a. Това означава, че ако напишеш string от character-и, например "-4", то Console.Read() ще вземе само "-" :). А стойноста ти е 45, понеже ASCII кода на "-" е 45 :).

За да вземеш число от конзолата и да го cast-неш към числов тип, можеш да ползваш Parse метода, на самите числови типове. Например, ако искаш да вземеш int стойност от конзолата, ще ползваш int myInt = int.Parse(Console.ReadLine()). Забележи, че ползвам Console.ReadLine(), която връща "the next line of characters", вместо "the next character", или иначе казано връща написаната на конзолата линия като стринг, а не само първия char от всичко написано.

0
Bars1967 avatar Bars1967 9 Точки

Даааа, открих го преди час

Console.Write("Enter a character: ");

long ch = long.Parse(Console.ReadLine());

 

{

if (ch >= System.SByte.MinValue && ch <= System.SByte.MaxValue)

{

Console.WriteLine("This is a SBYTE type");

}

}

{

if (ch >= System.Byte.MinValue && ch <= System.Byte.MaxValue)

{

Console.WriteLine("This is a BYTE type");

}

}

{

if (ch >= -32768 && ch <= 32767)

{

Console.WriteLine("This is a SHORT type");

}

}

{

if (ch >= 0 && ch <= 65535)

{

Console.WriteLine("This is a USHORT type");

}

}

{

if (ch >= -2147483648 && ch <= 2147483647)

{

Console.WriteLine("This is a INT type");

}

}

{

if (ch >= 0 && ch <= 4294967295)

{

Console.WriteLine("This is a UINT type");

}

}

{

if (ch >= -9223372036854775808 && ch <= 9223372036854775807) - ТУК ГО ПРИЕ

{

Console.WriteLine("This is a long type");

}

}

{

if (ch >= 0 && ch < 18446744073709551614) - ТУК МИ КАЗА : struct System.UInt64 Represent a 64-bit unsigned integer. Eror: Operator "<" cannot applied to operands of type ""long" and "ulong"

{

Console.WriteLine("This is a long type");

}

}

Интересно ми е, защо тогава прие по-горе "operands < " за long ?

 

0
Bars1967 avatar Bars1967 9 Точки

Като власите - на края на Дунава ... :)

Но пък поне разбрах за parse.

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.