<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: преобразования типов в С</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7652.html</link>
    <description>Приветствую,&lt;br&gt;&lt;br&gt;в С есть два понятия - &quot;integral promotion&quot; и &quot;arithmetic conversion&quot;. Никак не могу окончательно разобраться. Вот пример:&lt;br&gt;&lt;br&gt;char a = 9;&lt;br&gt;unsigned b = 4;&lt;br&gt;a = b + a;&lt;br&gt;&lt;br&gt;Как я понимаю, &apos;a&apos; будет преобразован к int? Но ведь это не означает, что компилятор под &apos;a&apos; выделит 4 байта вместо одного (если рассматривать систему с int=32бита)? Т.е. компилятор задействует какое-то внутреннее представление для сконвертированного типа?&lt;br&gt;&lt;br&gt;Спасибо за пояснения.&lt;br&gt;</description>

<item>
    <title>преобразования типов в С (mikra)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7652.html#6</link>
    <pubDate>Mon, 20 Oct 2008 12:36:58 GMT</pubDate>
    <description>&amp;gt;&amp;gt;Компилятор на char все равно выделит int или даже больше, поскольку выравнивает &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Это определяется стандартом языка или архитектурой платформы? &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;&amp;gt;по заданному размеру все переменные. Этот размер регулируется ключами компилятора. Тоесть &lt;br&gt;&amp;gt;&amp;gt;физически под 1 байтовую переменную будет выделено не менее 4 байт, &lt;br&gt;&amp;gt;&amp;gt;3 из которых никто никогда не использует. (На самом деле граница &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;тогда по идее и отладчик должен показывать, что под переменную типа char &lt;br&gt;&amp;gt;выделено 32бита.&lt;br&gt;&lt;br&gt;Граница выравнивания определяется только установками компилятора. Выставить нужную границу интересно пользователю, и он для оптимизации выставляет ее равной разрядности платформы.&lt;br&gt;Смысл выравнивания заключается в том, чтобы ускорить операции с памятью. 32 битному процессору на чтение 32 битной ячейки памяти нужно меньше тактов, чем на чтение 16 или 8 битной ячейки памяти. Существует таблица ассемблерных команд с временами их выполнения.&lt;br&gt;Для 64 разрядного процессора, соответственно, проще работать с 64 разрядными ячейками.&lt;br&gt;&lt;br&gt;Ес</description>
</item>

<item>
    <title>преобразования типов в С (roman)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7652.html#5</link>
    <pubDate>Mon, 20 Oct 2008 00:11:32 GMT</pubDate>
    <description>Есть ли какое-то rule of thumb использования типов в программах, при передаче аргуменов функций, чтобы, как говорится, голова не болела, как и во что будут преобразовываться типы?&lt;br&gt;&lt;br&gt;&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;&amp;gt;unsigned b = 4; &lt;br&gt;&amp;gt;&amp;gt;a = b + a; &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Подразумеваемые приведения к типам будут выглядеть вот как: &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;&#091;code&#093; &lt;br&gt;&amp;gt;a = (char) (b + (unsigned)a); &lt;br&gt;&amp;gt;&#091;/code&#093; &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;(а ссылки на msdn считаю на этом форуме неуместными :) &lt;br&gt;&lt;br&gt;На тех страницах, ссылки на которые были здесь приведены, фактически пересказывается стандарт С - ИМХО в таких рамках msdn допустим :)&lt;br&gt;</description>
</item>

<item>
    <title>преобразования типов в С (Хоменко)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7652.html#4</link>
    <pubDate>Sun, 19 Oct 2008 23:01:58 GMT</pubDate>
    <description>&amp;gt;char a = 9; &lt;br&gt;&amp;gt;unsigned b = 4; &lt;br&gt;&amp;gt;a = b + a; &lt;br&gt;&lt;br&gt;Подразумеваемые приведения к типам будут выглядеть вот как:&lt;br&gt;&lt;br&gt;&#091;code&#093;&lt;br&gt;a = (char) (b + (unsigned)a);&lt;br&gt;&#091;/code&#093;&lt;br&gt;&lt;br&gt;(а ссылки на msdn считаю на этом форуме неуместными :)&lt;br&gt;</description>
</item>

<item>
    <title>преобразования типов в С (Аноним)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7652.html#3</link>
    <pubDate>Sat, 18 Oct 2008 06:35:41 GMT</pubDate>
    <description>&amp;gt;Как я понимаю, &apos;a&apos; будет преобразован к int?&lt;br&gt;&lt;br&gt;В Unsigned Int. При операции между разными типами, меньший по размеру операнд преобразуется в тип большего, знаковое в беззнаковое, если другой операнд беззнаковый.&lt;br&gt;&lt;br&gt;&amp;gt; Но ведь это не &lt;br&gt;&amp;gt;означает, что компилятор под &apos;a&apos; выделит 4 байта вместо одного&lt;br&gt;&lt;br&gt;Нет, он сделает ещё одну переменную, внутреннюю типа unsigned. Но никакой памяти не потребуется так как все преобразования будут в регистрах процессора, в тех самых которые будут складываться.&lt;br&gt;&lt;br&gt;А вот char =  unsigned - это опасная операция, на то и недовольство ))&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>преобразования типов в С (cruz)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7652.html#2</link>
    <pubDate>Sat, 18 Oct 2008 04:18:28 GMT</pubDate>
    <description>Приветствую,&lt;br&gt;&lt;br&gt;спасибо за ответ.&lt;br&gt;&lt;br&gt;&amp;gt;Компилятор на char все равно выделит int или даже больше, поскольку выравнивает &lt;br&gt;&lt;br&gt;Это определяется стандартом языка или архитектурой платформы?&lt;br&gt;&lt;br&gt;&amp;gt;по заданному размеру все переменные. Этот размер регулируется ключами компилятора. Тоесть &lt;br&gt;&amp;gt;физически под 1 байтовую переменную будет выделено не менее 4 байт, &lt;br&gt;&amp;gt;3 из которых никто никогда не использует. (На самом деле граница &lt;br&gt;&lt;br&gt;тогда по идее и отладчик должен показывать, что под переменную типа char выделено 32бита. Я это проверил в gdb на x86, на объявление&lt;br&gt;&lt;br&gt;char j=6;&lt;br&gt;&lt;br&gt;(gdb) p j&lt;br&gt;$1 = 6 &apos;&#092;006&apos;&lt;br&gt;(gdb) x/t &amp;j&lt;br&gt;0xbf955af3:     10010101010110110001000000000110&lt;br&gt;(gdb)&lt;br&gt;&lt;br&gt;видно что крайние правые 8 бит отображают значение 6.&lt;br&gt;&lt;br&gt;&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;или компилятору не так очевидно, как этого хотел неискушенный кодер. Это &lt;br&gt;&amp;gt;тема приведения типов. &#091;1,3&#093; &lt;br&gt;&amp;gt;Приведение типов необходимо для операций над &quot;разнородными&quot; переменными. Чтобы операция выполнилась правильно &lt;br&gt;&amp;gt;компилятор должен привести используемые в операции пе</description>
</item>

<item>
    <title>преобразования типов в С (mikra)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7652.html#1</link>
    <pubDate>Fri, 17 Oct 2008 08:32:00 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;char a = 9; &lt;br&gt;&amp;gt;unsigned b = 4; &lt;br&gt;&amp;gt;a = b + a; &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Как я понимаю, &apos;a&apos; будет преобразован к int? Но ведь это не &lt;br&gt;&amp;gt;означает, что компилятор под &apos;a&apos; выделит 4 байта вместо одного (если &lt;br&gt;&amp;gt;рассматривать систему с int=32бита)? Т.е. компилятор задействует какое-то внутреннее представление для &lt;br&gt;&amp;gt;сконвертированного типа? &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Спасибо за пояснения. &lt;br&gt;&lt;br&gt;Не претендую на истину...&lt;br&gt;Компилятор на char все равно выделит int или даже больше, поскольку выравнивает по заданному размеру все переменные. Этот размер регулируется ключами компилятора. Тоесть физически под 1 байтовую переменную будет выделено не менее 4 байт, 3 из которых никто никогда не использует. (На самом деле граница выравнивания может быть разной в разных платформах и при разных умолчаниях компилятора о выравнивании. Но чтоб проще было, я назвал границу в 4 байта)&lt;br&gt;&lt;br&gt;&quot;Integral promotion&quot; это &quot;внутреннее представление&quot;. Исходя из названия, что-то может представляться процессору или компилятору не так очевидно, как этого хотел неиск</description>
</item>

</channel>
</rss>
