diff --git a/Exercices/Programmes/prog-2.rst b/Exercices/Programmes/prog-2.rst
index d825e97652fe59212e4c615c5a25799c8180b321..02b3dcf42efaf8f529896a6aea030da9e3572f33 100644
--- a/Exercices/Programmes/prog-2.rst
+++ b/Exercices/Programmes/prog-2.rst
@@ -72,6 +72,14 @@ Questions de discussion
 
 #. Soit ``char *ptr = "Test"``. Itérez sur ce pointeur et affichez avec `printf(3)`_ la valeur et l'adresse mémoire où se trouve stocké chaque caractère de deux façons différentes. Regardez la manpage de `printf(3)`_ pour savoir comment afficher la valeur d'un pointeur.
 
+#. Lorsque l'on veut améliorer les performances d'un programme, il est utile de pouvoir mesurer précisément son temps d'exécution. La commande `time(1posix)`_ permet d'effectuer cette mesure depuis la ligne de commande. Parfois, on souhaite mesurer le temps de calcul une partie critique d'un code. Une façon simple pour obtenir cette mesure est d'utiliser `gettimeofday(2)`_ comme dans l'exemple ci-dessous (:download:`/Programmes/s2_perf.c`).
+
+        .. literalinclude:: /Programmes/s2_perf.c
+                :encoding: utf-8
+                :language: c
+
+   Pour certaines opérations, les performances dépendent du type de données utilisé. Modifiez le programme ci-dessous de façon à utiliser un calcul plus compliqué que la simple addition et comparez sur de longues itérations (:math:`10^7` ou plus) les performances de cette opération lorsqu'elle utilise des ``int``, ``long long``, ``double`` ou ``float``. Les performances sont-elles identiques ?
+
 
 Questions de bilan final
 ------------------------
@@ -86,12 +94,12 @@ Questions de bilan final
                 };
 
 
-#. Lorsque l'on veut améliorer les performances d'un programme, il est utile de pouvoir mesurer précisément son temps d'exécution. La commande `time(1posix)`_ permet d'effectuer cette mesure depuis la ligne de commande. Parfois, on souhaite mesurer le temps de calcul une partie critique d'un code. Une façon simple pour obtenir cette mesure est d'utiliser `gettimeofday(2)`_ comme dans l'exemple ci-dessous (:download:`/Programmes/s2_perf.c`).
+#. Considérez le programme suivant.
 
-        .. literalinclude:: /Programmes/s2_perf.c
+        .. literalinclude:: /Programmes/s2_qbf.c
                 :encoding: utf-8
                 :language: c
 
-   Pour certaines opérations, les performances dépendent du type de données utilisé. Modifiez le programme ci-dessous de façon à utiliser un calcul plus compliqué que la simple addition et comparez sur de longues itérations (:math:`10^7` ou plus) les performances de cette opération lorsqu'elle utilise des ``int``, ``long long``, ``double`` ou ``float``. Les performances sont-elles identiques ?
-
-
+      * Sans executer le programme, essayez de comprendre son fonctionnement. En particulier, quelles seront les adresses affichées à chaque tour de boucle?
+      * Compilez le programme et exécutez le. Expliquez sa sortie et comparez avec vos attentes.
+      * (Bonus) Expliquez les valeurs affichées lors de l'exécution de la dernière boucle.
diff --git a/Exercices/Programmes/s2_qbf.c b/Exercices/Programmes/s2_qbf.c
new file mode 100644
index 0000000000000000000000000000000000000000..4fb42a78bf4aee241ab36f0486b6df6736fb4b06
--- /dev/null
+++ b/Exercices/Programmes/s2_qbf.c
@@ -0,0 +1,25 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdint.h>
+
+int main() {
+	char strtab[36] = "Coucou!! Je suis un grand string\n";
+	char *str = strtab;
+	int i;
+	for (i = 0; i < 8; i++) {
+		char c = str[i];
+		printf("Char %d, located at %p, is %c\n", i, &str[i], c);
+	}
+	uint32_t *str2 = (uint32_t *) str;
+	for (i = 0; i < 8; i++) {
+		uint32_t ui = str2[i];
+		printf("UInt %d, located at %p, is %u\n", i, &str2[i], ui);
+	}
+	str2[0] = 1801675080;
+	str2[1] = 555836517;
+	for (i = 0; i < 8; i++) {
+		char c = str[i];
+		printf("Char %d, located at %p, is %c\n", i, &str[i], c);
+	}
+	return 0;
+}