unsigned long long int странное поведение - PullRequest
4 голосов
/ 13 июля 2011

этот код C

unsigned long int a, b, x;
float c, d, y;

a = 6;
b = 2;
x = a/b;

c = 6.0;
d = 2.0;
y = c/d;

printf("\n x: %d \n y: %f \n",x,y);

работает правильно и печатает

x: 3 
y: 3.000000

однако, когда я изменяю первую строку на эту

unsigned long long int a, b, x;

Я получаю этот вывод:

x: 3 
y: 0.000000 

это действительно поражает меня ... Я ничего не изменил с c, d и y - почему я это получаю? Я использую GCC на Linux

Ответы [ 2 ]

7 голосов
/ 13 июля 2011

Для последнего использования:

printf("\n x: %llu \n y: %f \n",x,y);

Используйте u для беззнаковых интегралов (ваш вывод верен только потому, что вы используете небольшие значения). Используйте модификатор ll для длинных длин, иначе printf будет использовать неправильный размер для декодирования второго параметра (x) для printf, поэтому он использует неверный адрес для получения y.

2 голосов
/ 13 июля 2011

Вы должны использовать:

printf("\n x: %llu \n y: %f \n", x, y); 

В противном случае произойдет нечто подобное (например, для системы, где unsigned long int - это 4 байта, unsigned long long int - это 8 байтов, а float - это 4 байта):

  1. [[03 00 00 00] (unsigned long int) [3.0] (float)] все правильно, вы печатаете два 4-байтовых значения.
  2. [[03 00 00 00 00 00 00 00] (unsigned long long int) [3.0] (float)] здесь вы печатаете два 4 значения печати, но на самом деле в буфере, который получил printf, есть одно 8-байтовое значение и одно 4-байтовое значение, поэтому вы печатаете только первые 8 байтов:)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...