Sei sulla pagina 1di 26

Notacin Hexadecimal

Dgito Hex Valor decimal Valor binario 0 0 0000 1 1 0001 2 2 0010 3 3 0011 4 4 0100 5 5 0101 6 6 0110 7 7 0111

Dgito Hex Valor decimal Valor binario

8 8 1000

9 9 1001

A 10 1010

B 11 1011

C 12 1100

D 13 1101

E 14 1110

F 15 1111

Problema 1
Realiza las siguientes conversiones:

0x8F7A93 a binario 1011011110011100 a hexadecimal 0xC4E5D a binario 1101011011011111100110 a hexadecimal

Problema 2
Completa la tabla de potencias de dos.

n 11 7

2n (decimal) 2048 8192

2n (hexadecimal) 0x800

0x20000 16 256 0x20

Problema 3
Completa la tabla de bytes.
Decimal 0 55 136 243 01010010 10101100 11100111 0xA7 0x3E 0xBC Binario 00000000 Hexadecimal 0x00

Problema 4
Intenta las operaciones sin convertir bases: 0x502C + 0x8 = 0x502C 0x30 = 0x502C + 64 = 0x50DA 0x502C =

Tipos de Datos Multi-byte *


Programa: Desplegar en hexadecimal (i) una constante de un tipo de datos multi-byte (ii) cada byte de la constante segn el orden en que aparecen en la memoria

Problema 5
Realiza las operaciones Booleanas entre los bytes A y B (byte = vector de bits)

Operacin A B ~A ~B A&B A|B A^B

Resultado [01101001] [01010101]

Problema 6
Qu hace la siguiente funcin? voidips(int*x,int*y) { *x^=*y; *y^=*x; *x^=*y; }

Problema 7

(intx=0x98FDECBA)

Escribe expresiones en C para: El byte menos significativo de x, con los dems bits puestos a uno [0xFFFFFFBA] El complemento del byte menos significativo de x, con los dems bits sin cambio [0x98FDEC45] Todo x excepto su byte menos significativo, que ser puesto a cero [0x98FDEC00]

Operadores Lgicos

Booleanos

Operan bit a bit entre tipos enteros & (and), | (or), ^ (xor), ~ (not)

Proposicionales

Falso = 0, Verdadero 0 (tpicamente 1) Operan sobre el valor de los enteros && (and), || (or), ! (not)

Problema 8
x = 0x66 y = 0x93

Expresin x&y x|y ~x | ~y x & !y

Valor

Expresin x && y x || y !x || !y x && ~y

Valor

Problema 9
Qu hace la siguiente funcin? intiseq(intx,inty) { return!(x^y); }

Desplazamientos Lgicos

x >> k, desplaza los bits de x k lugares a la derecha, rellenando con ceros por la izquierda 11001110 >> 3 = 00011001

x << k, desplaza los bits de x k lugares a la izquierda, rellenando con ceros por la derecha 11001110 << 5 = 11000000

Desplazamientos Aritmticos
(default para tipos con signo)

x >> k, desplaza los bits de x k lugares a la derecha, rellenando con copias del MSB por la izquierda 11001110 >> 3 = 11111001

x << k, desplaza los bits de x k lugares a la izquierda, rellenando con ceros por la derecha 11001110 << 5 = 11000000

Problema 10
Completa la tabla
x 0xF0 0x0F 0xCC 0x55 x << 3 x >> 3 (lgico) x >> 3 (aritmtico)

Interpretacin de Tipos Enteros (I)

Sin signo (unsigned)


B2U w x = x i 2
i=0 w1 i

Con signo (default) B2T w x =x w1 2


w1

xi 2
i=0

w2

Interpretacin de Tipos Enteros (II) *


2w +2w1
Complemento a dos con signo 0

2w1 Sin signo 0

2w1 2w 2w1
Sin signo

+2w1 0 2w1
Complemento a dos con signo

Formatos de printf()

Ejecucin de printf("ux = %u = %d = %#08X\n", ux, ux, ux); ux = 2147483648 = -2147483648 = 0X80000000 Ejecucin de printf("tx = %u = %d = %#08X\n", tx, tx, tx); tx = 4294967295 = -1 = 0XFFFFFFFF

Promocin a unsigned*
Regla (ojo!) : Si una operacin involucra enteros con y sin signo, los primeros sern promovidos a enteros sin signo antes de realizar la operacin.

Extensin de signo y truncamiento

Al asignar a un tipo de datos ms grande, los enteros con signo llenan los bits ms significativos con copias del MSB para NO CAMBIAR SU VALOR. Los enteros sin signo se llenan con ceros. Al asignar a un tipo de datos ms chico, se rescatan nicamente los bits menos significativos que caben en el tipo destino.

Problema 11
Describe el bug en esta funcin.
floatsuma_elems(floata[],unsigned num) { inti; floatresultado=0; for(i=0;i<=num1;i++) resultado+=a[i]; returnresultado; }

Suma Entera

32 28 24 20 16 12 8 4 0 0 1 2 8 9 15 14 13 12 11 10

10

11

12

13

14

15

Suma sin signo (unsigned nibble)

16 14 12 10 8 6 4 2 0 0 1 2 8 9 15 14 13 12 11 10

10

11

12

13

14

15

Suma con signo en complemento a dos (signed nibble)

8 6 4 2 0 -2 -4 -6 -8 -8 -7 -6 0 1 2 3 4 5 6 7

-5

-4

-3

-2

-1

-8

-7

-6

-5

-4

-3

-2

-1

Divisin entre potencias de dos

No hay problema para nmeros positivos ( x>>k=x/(1<<k)) Para nmeros negativos, se requiere una correccin previa ( x+2^k1 )
(x<0?(x+(1<<k)1):x)>>k

Problema 12

(V siempre / F:ejemplo)

intx=foo();/*valorarbitrario*/ inty=bar();/*valorarbitrario*/ unsignedux=x; unsigneduy=y; A)(x>=0)||((2*x)<0) B)(x&7)!=7||(x<<30<0) C)(x*x)>=0 D)x<0||x<=0 E)x>0||x>=0 F)x*y==ux*uy G)~x*y+ux*uy==y

Potrebbero piacerti anche