<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=429991&amp;view=findpost&amp;p=3877211</guid>
        <pubDate>Mon, 26 Sep 2022 18:47:53 +0000</pubDate>
        <title>неявное приведение типов</title>
        <link>https://forum.sources.ru/index.php?showtopic=429991&amp;view=findpost&amp;p=3877211</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=429991&view=findpost&p=3877112'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Dushevny &#064; <time class="tag-quote__quoted-time" datetime="2022-09-25T21:37:22+00:00">25.09.22, 21:37</time></span><div class='quote '>Такого старого под рукой не было.</div></div>Там то же, только без явного boolевого типа.<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Each of the operators &lt; (less than), &gt; (greater than), &lt;= (less than or equal to), and &gt;= (greater than or equal to) shall yield 1 if the specified relation is true and 0 if it is false. The result has type int.<br>
...<br>
The == (equal to) and the &#33;= (not equal to) operators are analogous to the relational operators except for their lower precedence.</div></div> <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2022-09-26T22:08:36+03:00">26.09.22, 19:08</time></span></span><br>
P.S. Почему делается каст именно к беззнаковому при несовпадении знаковости, ябеспонятия. Но могу выдвинуть две гипотезы.<ul class="tag-list"><li>Очень часто, особенно на заре, char использовался как маленький int, и он был в большинстве своём знаковый, т.к. так однообразнее с другими типами, где отсутствие явной знаковости означает signed, а беззнаковым ему было быть особо без надобности, т.к. ASCII стандартизирована на коды 0-127. Если с ним смешивать операции с unsigned int-ом, то получился бы полный кавардак. a + b  легко дало бы странный результат, ибо интутивно байт со значением 200 воспринимается отнюдь не как -56. Поэтому в частности при смене не только знака, но и длины сначала меняется длина и только потом знаковость. Так при смене длины сохраняется исходное значение до того, как сменится интерпретация его знакового бита. Потенциально это приводит к меньшему количеству странностей в поведении.</li><li>Операции с беззнаковыми целыми всегда работают по модулю 2<sup class='tag-sup'>N</sup>, так что ситуация переполнения в принципе невозможна. Операции со знаковыми целыми этого свойства лишены, поэтому переполнения потенциально могут привести к исключениям. И я даже знаю пару таких процессоров. Стандарт тут чётко говорит за implementation defined behavior. В случае каста к беззнаковому такие системы при переполнении всё равно отрапортуют об исключении, но оно будет одно, в противоположном случае более вероятно, что исключений будет много, большинство из которых лишние.</li></ul>Обе гипотезы сомнительные, так что относитесь к ним как к ИМХО.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=429991&amp;view=findpost&amp;p=3877112</guid>
        <pubDate>Sun, 25 Sep 2022 21:37:22 +0000</pubDate>
        <title>неявное приведение типов</title>
        <link>https://forum.sources.ru/index.php?showtopic=429991&amp;view=findpost&amp;p=3877112</link>
        <description><![CDATA[Dushevny: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=429991&view=findpost&p=3877069'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>FasterHarder &#064; <time class="tag-quote__quoted-time" datetime="2022-09-25T11:56:59+00:00">25.09.22, 11:56</time></span><div class='quote '>надо сверить это для С89</div></div>Такого старого под рукой не было. А разве имеет смысл писать, ограничивая себя стандартом 33-летней давности?<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=429991&view=findpost&p=3877069'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>FasterHarder &#064; <time class="tag-quote__quoted-time" datetime="2022-09-25T11:56:59+00:00">25.09.22, 11:56</time></span><div class='quote '>а вообще всех этих приведений надо по максам избегать, т к можно получить трудноуловимые проблемы</div></div>Вовсе необязательно. Достаточно просто знать, как они работают и исходник не будет перегружен явными приведениями типов в тех местах, где в них нет необходимости.]]></description>
        <author>Dushevny</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=429991&amp;view=findpost&amp;p=3877069</guid>
        <pubDate>Sun, 25 Sep 2022 11:56:59 +0000</pubDate>
        <title>неявное приведение типов</title>
        <link>https://forum.sources.ru/index.php?showtopic=429991&amp;view=findpost&amp;p=3877069</link>
        <description><![CDATA[FasterHarder: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=429991&view=findpost&p=3876904'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>macomics &#064; <time class="tag-quote__quoted-time" datetime="2022-09-24T17:22:59+00:00">24.09.22, 17:22</time></span><div class='quote '> После операции сравнения используется команда записи значения флага в регистр (seta - при сравнении без знаковых/setg - после сравнения знаковых), которая дает значения 0 или 1 в зависимости от операции сравнения. т.е. на вывод поступает именно значение типа bool (0 = false / 1 = true) после операции сравнения. </div></div><br>
понятно, этого не знал, спс<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=429991&view=findpost&p=3876935'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Dushevny &#064; <time class="tag-quote__quoted-time" datetime="2022-09-24T19:04:42+00:00">24.09.22, 19:04</time></span><div class='quote '>Открываем стандарт С99:</div></div><br>
ну я как бы это того писал, что мол:<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=429991&view=findpost&p=3876900'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>FasterHarder &#064; <time class="tag-quote__quoted-time" datetime="2022-09-24T16:58:05+00:00">24.09.22, 16:58</time></span><div class='quote '>код на языке С ( С89 ):</div></div><br>
надо сверить это для С89<br>
<br>
но <strong class='tag-b'>macomics</strong> выше пояснил этот момент вроде как...<br>
<br>
зы: а вообще всех этих приведений надо по максам избегать, т к можно получить трудноуловимые проблемы]]></description>
        <author>FasterHarder</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=429991&amp;view=findpost&amp;p=3876963</guid>
        <pubDate>Sat, 24 Sep 2022 20:17:48 +0000</pubDate>
        <title>неявное приведение типов</title>
        <link>https://forum.sources.ru/index.php?showtopic=429991&amp;view=findpost&amp;p=3876963</link>
        <description><![CDATA[Majestio: <strong class='tag-b'>Dushevny</strong>, ответ - бомба&#33; :lool:]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=429991&amp;view=findpost&amp;p=3876935</guid>
        <pubDate>Sat, 24 Sep 2022 19:04:42 +0000</pubDate>
        <title>неявное приведение типов</title>
        <link>https://forum.sources.ru/index.php?showtopic=429991&amp;view=findpost&amp;p=3876935</link>
        <description><![CDATA[Dushevny: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=429991&view=findpost&p=3876900'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>FasterHarder &#064; <time class="tag-quote__quoted-time" datetime="2022-09-24T16:58:05+00:00">24.09.22, 16:58</time></span><div class='quote '>Но вот всегда в таких ситуациях печатается 1; не 2, не 43, не -5392, а именно 1. Почему? </div></div>Открываем стандарт С99:<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>6.3.1.2 Boolean type<br>
When any scalar value is converted to _Bool, the result is 0 if the value compares equal to 0; otherwise, the result is 1.</div></div>Никакой магии.]]></description>
        <author>Dushevny</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=429991&amp;view=findpost&amp;p=3876904</guid>
        <pubDate>Sat, 24 Sep 2022 17:22:59 +0000</pubDate>
        <title>неявное приведение типов</title>
        <link>https://forum.sources.ru/index.php?showtopic=429991&amp;view=findpost&amp;p=3876904</link>
        <description><![CDATA[macomics: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=429991&view=findpost&p=3876900'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>FasterHarder &#064; <time class="tag-quote__quoted-time" datetime="2022-09-24T16:58:05+00:00">24.09.22, 16:58</time></span><div class='quote '>10000000 00001011</div></div><br>
При переходе от без знакового числа к числу в дополнительном коде бит знака возникает сам в результате инверсии. Его не нужно описывать отдельно.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">int b = 11 // 0000`0000`0000`1011</div><div class="code_line">b = -b // инверсия 1111`1111`1111`0100 и добавление единицы 1111`1111`1111`0101 - старший разряд без особой обработки стал равен знаку числа.</div><div class="code_line">b = -b // инверсия 0000`0000`0000`1010 и добавление единицы 0000`0000`0000`1011 - старший разряд без особой обработки опять стал равен знаку числа.</div><div class="code_line">&nbsp;</div><div class="code_line">//Тоже самое справедливо для значения 0</div><div class="code_line">b = 0 // 0000`0000`0000`0000</div><div class="code_line">b = -b // инверсия 1111`1111`1111`1111 и добавление единицы 0000`0000`0000`0000</div><div class="code_line">&nbsp;</div><div class="code_line">//И для значения 0x8000</div><div class="code_line">b = 0x8000 // 1000`0000`0000`0000</div><div class="code_line">b = -b // инверсия 0111`1111`1111`1111 и добавление единицы 1000`0000`0000`0000</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
После операции сравнения используется команда записи значения флага в регистр (seta - при сравнении без знаковых/setg - после сравнения знаковых), которая дает значения 0 или 1 в зависимости от операции сравнения. т.е. на вывод поступает именно значение типа bool (0 = false / 1 = true) после операции сравнения.]]></description>
        <author>macomics</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=429991&amp;view=findpost&amp;p=3876900</guid>
        <pubDate>Sat, 24 Sep 2022 16:58:05 +0000</pubDate>
        <title>неявное приведение типов</title>
        <link>https://forum.sources.ru/index.php?showtopic=429991&amp;view=findpost&amp;p=3876900</link>
        <description><![CDATA[FasterHarder: Всем хай&#33;<br>
<br>
Есть такой ( вроде бы ) простейший код на языке С ( С89 ):<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;stdio.h&#62;</div><div class="code_line">#include &#60;stdlib.h&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">int main( void )</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;unsigned int a;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int b;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;a = 5;</div><div class="code_line">&nbsp;&nbsp; &nbsp;b = -11;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf( &quot;b &#62; a: %d\n\n&quot;, b &#62; a );</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;system( &quot;pause&quot; );</div><div class="code_line">&nbsp;&nbsp; &nbsp;return EXIT_SUCCESS;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
хотелось бы пошагово его разобрать на битовом уровне<br>
<br>
Оговорка: пусть для упрощения писанины типы данных unsigned int и int 2байтовые ( по 16 бит )<br>
------------------------------------------------------------------------------------------------<br>
в этой строке<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp;unsigned int a;</div></ol></div></div></div></div><br>
резервируется память под переменную a в размере 16 бит ( 2 байта )<br>
<br>
в этой строке<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp;int b;</div></ol></div></div></div></div><br>
резервируется память под переменную b в размере 16 бит ( 2 байта )<br>
<br>
в этой строке<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp;a = 5;</div></ol></div></div></div></div><br>
16 бит принимают заданное значение. Тип данных переменной а беззнаковый, т е старший бит участвует<br>
a = 00000000 00000101 - двоичное представление в памяти ЭВМ<br>
<br>
в этой строке<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp;b = -11;</div></ol></div></div></div></div><br>
16 бит принимают заданное значение. Тип данных переменной b знаковый, т е старший бит участвует и будет равен 1<br>
также отр.числа хранятся в доп.коде, который получается из прямого инвертированием бит + 1<br>
10000000 00001011 --&#62; 11111111 11110100 --&#62; 11111111 11110101<br>
b = 11111111 11110101 - двоичное представление в памяти ЭВМ<br>
<br>
в итоге<br>
a = 00000000 00000101<br>
b = 11111111 11110101<br>
--------------------------<br>
<br>
и затем последняя, самая сложная)) строка кода:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp;printf( &quot;b &#62; a: %d\n\n&quot;, b &#62; a );</div></ol></div></div></div></div><br>
сначала компилятор вычисляет выражение b &gt; a + он замечает, что у них РАЗНЫЕ типы данных. По правилам, заложенным где-то в недрах его он все приводит к беззнаковому типу, т е к типу данных unsigned int.<br>
То есть теперь компилятор смотрит на эти биты 11111111 11110101 ( это переменная b ) с тз типа данных unsigned int и это число 2^16 - 11 = 65 525<br>
<br>
происходит сравнение:<br>
65 525 &gt; 5 - ну как бы да)<br>
это лог. операция и ее результатом является значение TRUE/FALSE. При этом для языка Си <strong class='tag-b'>FALSE это ТОЛЬКО значение 0</strong>, а TRUE - все остальное целочисленное ( даже отр.числа )<br>
<br>
при печати стоит модификатор %d, т е давит знаковый целочисленный тип. Что распечатается в ответе? Печатается 1, ну в принципе это логично. Хотя, наверное, могло распечататься любое целое число, не равное 0 ( 0 отдан ТОЛЬКО false ). <strong class='tag-b'>Но вот всегда в таких ситуациях печатается 1; не 2, не 43, не -5392, а именно 1</strong>. Почему? - это небольшой доп. вопрос.<br>
-----------------------------------------------------<br>
<br>
все ли верно расписал выше или есть какие-то грубые нестыковки?<br>
спс. за внимание, надеюсь, не сильно утомил&#33;)]]></description>
        <author>FasterHarder</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	