<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: Dark Sorcering in C: utilizando bit-fields</title>
	<atom:link href="http://bgarber.notapipe.org/blog/2009/07/dark-sorcering-in-c-utilizando-bit-fields/feed/" rel="self" type="application/rss+xml" />
	<link>http://bgarber.notapipe.org/blog/2009/07/dark-sorcering-in-c-utilizando-bit-fields/</link>
	<description>Where nerds collide!</description>
	<lastBuildDate>Sat, 21 Jan 2012 14:32:18 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
	<item>
		<title>By: Bryan</title>
		<link>http://bgarber.notapipe.org/blog/2009/07/dark-sorcering-in-c-utilizando-bit-fields/comment-page-1/#comment-54</link>
		<dc:creator>Bryan</dc:creator>
		<pubDate>Thu, 30 Jul 2009 16:25:15 +0000</pubDate>
		<guid isPermaLink="false">http://bgarber.notapipe.org/blog/?p=79#comment-54</guid>
		<description>Ah, sim. Entendi o que tu disseste. O campo em si terá o tamanho especificado, mas quando o compilador for representar a estrutura em memória, ele utilizará o melhor tamanho adequado.

Aliás, o GCC tem a diretiva __attribute__ que tem a opção de tu dizer com quantos bytes tu quer representar aquela estrutura. Tipo:

typedef struct {
    unsigned char val: 1;
} __attribute__ ( (aligned ( 2 )) ) bit_t;

Vai fazer com que tua estrutura seja representada com o 2 bytes. ;-)

Valeu pela observação!</description>
		<content:encoded><![CDATA[<p>Ah, sim. Entendi o que tu disseste. O campo em si terá o tamanho especificado, mas quando o compilador for representar a estrutura em memória, ele utilizará o melhor tamanho adequado.</p>
<p>Aliás, o GCC tem a diretiva __attribute__ que tem a opção de tu dizer com quantos bytes tu quer representar aquela estrutura. Tipo:</p>
<p>typedef struct {<br />
    unsigned char val: 1;<br />
} __attribute__ ( (aligned ( 2 )) ) bit_t;</p>
<p>Vai fazer com que tua estrutura seja representada com o 2 bytes. <img src='http://bgarber.notapipe.org/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Valeu pela observação!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Bryan</title>
		<link>http://bgarber.notapipe.org/blog/2009/07/dark-sorcering-in-c-utilizando-bit-fields/comment-page-1/#comment-53</link>
		<dc:creator>Bryan</dc:creator>
		<pubDate>Thu, 30 Jul 2009 15:57:01 +0000</pubDate>
		<guid isPermaLink="false">http://bgarber.notapipe.org/blog/?p=79#comment-53</guid>
		<description>Valeu pela correção.

Mas se tu tentares colocar mais de um bit na estrutura bit_t, dará warning. O compilador deve arredondar somente para representar a struct.</description>
		<content:encoded><![CDATA[<p>Valeu pela correção.</p>
<p>Mas se tu tentares colocar mais de um bit na estrutura bit_t, dará warning. O compilador deve arredondar somente para representar a struct.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Fabio Utzig</title>
		<link>http://bgarber.notapipe.org/blog/2009/07/dark-sorcering-in-c-utilizando-bit-fields/comment-page-1/#comment-52</link>
		<dc:creator>Fabio Utzig</dc:creator>
		<pubDate>Thu, 30 Jul 2009 15:42:58 +0000</pubDate>
		<guid isPermaLink="false">http://bgarber.notapipe.org/blog/?p=79#comment-52</guid>
		<description>Bacana isto não?!

Usei muitas vezes na vida estruturas de bitfield. Elas especialmente interessantes pra mapear registradores de HW que são bitfields ou em protocolos de comunicação que usam campos com tamanhos arbitrários de campos. Acho que deve ser muito desagradável implementar um TCP/IP sem usar structs com bitfield já que o TCP usa vários campos com tamanhos de 5 bits e coisas assim.

Quanto ao tamanho eu discordo do que tu disse. Uma struct com bitfields não tem o tamanho do total de bitfields e sim o arrendodamento pra cima do tamanho em bytes mais adequado que a comporte. A bit_t tem 1 byte já que o C vai usar o char pra representá-la. Se tu adicionasse mais um bit à estrutura byte_t (digamos pra sinal) ela deixaria de ter 1 byte e passaria a ter 2 bytes.

Uma coisa que deve-se ter cuidado em bitfields é com endianess. Se tu transferir um valor pela rede de um computador com processador big endian para um little endian os bit terão de ser mexidos! Não entrarei em detalhes mas para entender isto dá pra olhar os fontes de alguns protocolos no kernel do Linux. Sempre que veres um bitfield lá vais ver um define _LITTLE_ENDIAN ou _BIG_ENDIAN (acho que é isto!).</description>
		<content:encoded><![CDATA[<p>Bacana isto não?!</p>
<p>Usei muitas vezes na vida estruturas de bitfield. Elas especialmente interessantes pra mapear registradores de HW que são bitfields ou em protocolos de comunicação que usam campos com tamanhos arbitrários de campos. Acho que deve ser muito desagradável implementar um TCP/IP sem usar structs com bitfield já que o TCP usa vários campos com tamanhos de 5 bits e coisas assim.</p>
<p>Quanto ao tamanho eu discordo do que tu disse. Uma struct com bitfields não tem o tamanho do total de bitfields e sim o arrendodamento pra cima do tamanho em bytes mais adequado que a comporte. A bit_t tem 1 byte já que o C vai usar o char pra representá-la. Se tu adicionasse mais um bit à estrutura byte_t (digamos pra sinal) ela deixaria de ter 1 byte e passaria a ter 2 bytes.</p>
<p>Uma coisa que deve-se ter cuidado em bitfields é com endianess. Se tu transferir um valor pela rede de um computador com processador big endian para um little endian os bit terão de ser mexidos! Não entrarei em detalhes mas para entender isto dá pra olhar os fontes de alguns protocolos no kernel do Linux. Sempre que veres um bitfield lá vais ver um define _LITTLE_ENDIAN ou _BIG_ENDIAN (acho que é isto!).</p>
]]></content:encoded>
	</item>
</channel>
</rss>

