C определить 64 бит на 32 бит - PullRequest
2 голосов
/ 29 октября 2009

Если я сделаю:

#define TIMEFIXCONST 11644473600

на 32-битной машине, будет ли он переполнен или будет храниться как long long и все еще работать должным образом? Должен ли я просто определить глобальный unsigned long long и использовать его вместо этого?

Ответы [ 5 ]

5 голосов
/ 29 октября 2009

Макрос - это только подстановка текста, макрос нельзя переполнить.
Это зависит от того, где вы назначите позже TIMEFIXCONST.

Но, как правило, при использовании констант используйте const int или const long long, если вам требуется.

3 голосов
/ 29 октября 2009

Номер нигде не «хранится». Он будет просто вставлен в исходный код программы, где вы используете макрос, так же, как если бы вы написали его напрямую. Но если вы хотите, чтобы сам литерал имел тип long long, напишите:

#define TIMEFIXCONST 11644473600LL
1 голос
/ 29 октября 2009

Стандартный (не?) Способ сделать это будет

#define TIMEFIXCONST 11644473600LL

Тогда это будет рассматриваться как "длинный длинный". Что произойдет после этого, зависит от оператора, в котором вы его используете (переполнение и т. Д.). Если вы попытаетесь присвоить его 32-битной переменной, она будет усечена, и компилятор должен выдать предупреждение.

0 голосов
/ 27 ноября 2015
#define TIMEFIXCONST 11644473600

Любое использование макроса TIMEFIXCONST расширяется во время компиляции до константы 11644473600. Он нигде не хранится, пока вы его не сохраните.

Десятичная целочисленная константа имеет тип int, long int или long long int, в зависимости от значения константы и диапазонов типов (это первый из тех типов, который достаточно широк, чтобы содержать значение ). Нет необходимости добавлять суффикс L или LL, если вы не хотите явно указывать тип. Даже тогда 11644473600L может иметь тип long long, а не long.

(В C89 / C90 он имеет тип int, long int или unsigned long int, но если unsigned long int только 32 бита, сама константа является ошибкой.)

Поскольку для 11644473600 требуется не менее 34 бит (плюс знаковый бит, если есть), он, вероятно, имеет тип long, если long равен 64 битам, или long long в противном случае.

Если вы присвоите это значение переменной int:

int n = TIMEFIXCONST;

будет преобразовано в int, а результат будет определен реализацией. Вы вероятно получите предупреждение во время компиляции; если вы этого не сделаете, узнайте, как включить больше предупреждений в вашем компиляторе.

0 голосов
/ 29 октября 2009

Если вы сохраните это в int, оно будет переполнено как на x64, так и на x86. Если вы сохраните его в long, у вас не будет проблем ни на одной из платформ. #define не имеет отношения к памяти.

...