Вынос мозга

Вчера на Хабре была публикация про то, как надо быть предельно осторожным при смешивании типов в выражениях при программировании на С/С++. Вот, ссылка на эту публикацию:

http://habrahabr.ru/post/201868/

Суть вот чём.

Мы очень часто пишем свои программы на языке высокого уровня, сознательно уходя от низкооуровневых проблем. Говоря более технично — переходим на более высокий уровень абстракции. Так, программируя на С/С++ мы часто забываем, что под Си-шными командами находятся конкретные команды (инструкции) микропроцессора. Когда мы обращаемся к базе данных, передаем по HTTP файл или вычисляем какие-то математические параметры, нам некогда думать о битах и байтах, наше внимание приковано к бизнес-логике, к верхнему уровню абстракции. Порой мы даже забываем прописные истины, как работают преобразования типов… и наступаем на грабли.

Так вот, я не поленился и прогнал обе проги — и на настольном компе (Pentium-4), и на RaspberryPi (ARM-11). Как и говорилось в Хабровской статье, я получил «неожиданное» поведение обеих программ на обычном компе. А вот на RPi вторая прога дала правильный результат — 1005.

Я на всяки случай напишу их еще раз.

#include <stdio.h>

int main(void)
{
  unsigned char a = 1, b;

  b = ~a >> 1;  // Вспомните приоритет операций! Скобки вам не помогут!
  printf("%u\n", b); // Напечатает число 255

  return 0;
}

А здесь зависит от архитектуры процессора. Intell напечатает 1004, а ARM11 — 1005:

#include <stdio.h>

int main(void)
{
  float a = 1.005, b = 1000;
  int c = a * b;

  printf("%d\n", c);  // Напечатает число 1004 или 1005

  return 0;
}
Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s