Я не могу использовать «долго долго»; что я должен использовать?

6
anon 5 Мар 2010 в 02:34
2
Почему вы не можете использовать long long? Ваш компилятор не поддерживает это?
 – 
Alok Singhal
5 Мар 2010 в 02:40
3
Поддерживает ли Darwin / MacOSX целочисленные определения типов фиксированного размера, такие как int64_t? Если так, я бы использовал их. См. opengroup.org/onlinepubs/000095399/basedefs/stdint.h.html для подробностей.
 – 
Void
5 Мар 2010 в 02:53

2 ответа

Лучший ответ

Предполагая, что Snow Leopard (Mac OS X 10.6.2 - Intel), тогда long будет 64-битным с компилятором по умолчанию.

Укажите 'g ++ -m64', и в более ранних версиях он, скорее всего, будет 64-битным.

 1 = sizeof(char)
 1 = sizeof(unsigned char)
 2 = sizeof(short)
 2 = sizeof(unsigned short)
 4 = sizeof(int)
 4 = sizeof(unsigned int)
 8 = sizeof(long)
 8 = sizeof(unsigned long)
 4 = sizeof(float)
 8 = sizeof(double)
16 = sizeof(long double)
 8 = sizeof(size_t)
 8 = sizeof(ptrdiff_t)
 8 = sizeof(time_t)
 8 = sizeof(void *)
 8 = sizeof(char *)
 8 = sizeof(short *)
 8 = sizeof(int *)
 8 = sizeof(long *)
 8 = sizeof(float *)
 8 = sizeof(double *)
 8 = sizeof(int (*)(void))
 8 = sizeof(double (*)(void))
 8 = sizeof(char *(*)(void))

Протестировано с:

i686-apple-darwin10-g++-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5646) (dot 1)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Компиляция с GCC 4.7.1 в Mac OS X 10.7.5 с опцией -std=c99 выводит программу более обширно. Спасибо apalopohapa за указание на недосмотр, который отсутствовал в оригинале long long и т. Д.

 1 = sizeof(char)
 1 = sizeof(unsigned char)
 2 = sizeof(short)
 2 = sizeof(unsigned short)
 4 = sizeof(int)
 4 = sizeof(unsigned int)
 8 = sizeof(long)
 8 = sizeof(unsigned long)
 4 = sizeof(float)
 8 = sizeof(double)
16 = sizeof(long double)
 8 = sizeof(size_t)
 8 = sizeof(ptrdiff_t)
 8 = sizeof(time_t)
 8 = sizeof(long long)
 8 = sizeof(unsigned long long)
 8 = sizeof(uintmax_t)
 1 = sizeof(int8_t)
 2 = sizeof(int16_t)
 4 = sizeof(int32_t)
 8 = sizeof(int64_t)
 1 = sizeof(int_least8_t)
 2 = sizeof(int_least16_t)
 4 = sizeof(int_least32_t)
 8 = sizeof(int_least64_t)
 1 = sizeof(int_fast8_t)
 2 = sizeof(int_fast16_t)
 4 = sizeof(int_fast32_t)
 8 = sizeof(int_fast64_t)
 8 = sizeof(uintptr_t)
 8 = sizeof(void *)
 8 = sizeof(char *)
 8 = sizeof(short *)
 8 = sizeof(int *)
 8 = sizeof(long *)
 8 = sizeof(float *)
 8 = sizeof(double *)
 8 = sizeof(int (*)(void))
 8 = sizeof(double (*)(void))
 8 = sizeof(char *(*)(void))
 1 = sizeof(struct { char a; })
 2 = sizeof(struct { short a; })
 4 = sizeof(struct { int a; })
 8 = sizeof(struct { long a; })
 4 = sizeof(struct { float a; })
 8 = sizeof(struct { double a; })
16 = sizeof(struct { char a; double b; })
16 = sizeof(struct { short a; double b; })
16 = sizeof(struct { long a; double b; })
 4 = sizeof(struct { char a; char b; short c; })
16 = sizeof(struct { char a; char b; long c; })
 4 = sizeof(struct { short a; short b; })
 6 = sizeof(struct { char a[3]; char b[3]; })
 8 = sizeof(struct { char a[3]; char b[3]; short c; })
16 = sizeof(struct { long double a; })
32 = sizeof(struct { char a; long double b; })
16 = sizeof(struct { char a; long long b; })
16 = sizeof(struct { char a; uintmax_t b; })
13
Community 23 Май 2017 в 14:52
4
Кроме того, если вы включаете , вы можете использовать int64_t и uint64_t, которые typedef'd для соответствующего типа типа и делает его явным, что вы используете.
 – 
bobDevil
5 Мар 2010 в 02:55
1
Int64_t at al на самом деле находятся в
 – 
Paul R
5 Мар 2010 в 11:40
4
Полагаться на таблицу, которую вы только что опубликовали, - плохой совет. Если вам нужны 64 бита, используйте int64_t. Это стандартно по какой-то причине.
 – 
asveikau
5 Мар 2010 в 13:08
@apalopohapa: МВД - чистый надзор. Должно быть, я скомпилировал старую версию или скомпилировал без -std=c99. Код от 05.03.2010 дает много дополнительных значений при компиляции с -std=c99. Смотрите обновление - и спасибо за вопрос.
 – 
Jonathan Leffler
6 Окт 2012 в 00:41

Включите <stdint.h> или <inttypes.h> (последний можно найти в некоторых других компиляторах, но оба они предоставляются компилятором Apple) и используйте uint64_t и int64_t. Они 64-битные как для 32-битных, так и для 64-битных целей.

5
Jonathan Leffler 22 Янв 2013 в 04:39