Скільки байтів не має довгих знаків?


84

Скільки байт unsigned long long? Це те саме, що unsigned long long int?


52
Do sizeof (без підпису довгий довгий).
Комуністична качка

2
Пов’язані, начебто. stackoverflow.com/questions/4329777 / ...
John Dibling

2
Стандарти С та С ++ повинні приймати матеріали із числом у них, щоб замінити спосіб автоматичного вибору компілятора. Щось на зразок float32, float64, int32 тощо до будь-якого обмеження, яке нам потрібно, а як щодо int256 або float1024? ... це справді зняло б біль ...
jokoon

2
@gokoon: як я пояснив у своїй відповіді, стандарт C вже є int32_t, uint64_tі т. д. C ++ отримає їх із майбутнім стандартом. Вони в заголовку <stdint.h>.
Fred Foo

1
як щодо плаваючого та подвійного?
jokoon

Відповіді:


82

Підсумок: це 64 біти або більше.

unsigned long longце те саме, що unsigned long long int. Його розмір залежить від платформи, але гарантується стандартом C (ISO C99) щонайменше 64 біт. У long longC89 такого не було, але, мабуть, навіть MSVC його підтримує, тому він досить портативний.

У чинному стандарті C ++ (виданому в 2003 році) такого немає long long, хоча багато компіляторів підтримують його як розширення. Майбутній стандарт C ++ 0x підтримуватиме його, і його розмір буде таким же, як і в C, тобто принаймні 64 біти.

Ви можете отримати точний розмір у байтах (8 біт на типових платформах) із виразом sizeof(unsigned long long). Якщо вам потрібні рівно 64 біти, використовуйте uint64_t, що визначено в заголовку <stdint.h>разом із купою пов’язаних типів (доступно в C99, C ++ 11 та деяких поточних компіляторах C ++).


2
@lars: sizeof(char) гарантовано поверне саме один . Він повертає, наскільки великий операнд за кількістю байтів, а не за кількістю "символів". Таким чином, його не байти "на більшості платформ" його байти на кожній платформі.
Джон Дайблінг,

1
@ John: це залежить від визначення байта . Якщо ви прирівнюєте charі байте, ви маєте рацію. Якщо ви рівняєте charі октет , то це змінюється.
Fred Foo

4
@lars: Ні, це не так. Char - це завжди рівно один байт на кожній платформі. Стандарт не визначає, скільки бітів у байті, але це інша річ. Реалізація може використовувати 64-бітові байти, що призведе до, sizeof(long long) == 1і це буде відповідати.
Джон Дайблінг,

1
@lars: Я вже в будь-якому випадку підтримав вас, але ось такий підказка: "гарантовано стандартом C (ISO C99) як мінімум 64 біти == 8 байт" Я не можу уявити невбудований світ, в якому 64 біти! = 8 байт, але Стандарт не гарантує цього.
Джон Дайблінг,

@ Джон: ще раз вправо. Видалено 64 біти == 8 байт, оскільки я вже перебуваю в режимі адвоката мови. І я чув, що насправді є вбудовані платформи, де байт становить 16 біт.
Fred Foo

17

Принадність С ++, як і С, полягає в тому, що розмір цих речей визначається реалізацією, тому немає правильної відповіді без вказання компілятора, який ви використовуєте. Це два однакові? Так. "long long" - це синонім "long long int" для будь-якого компілятора, який прийме обидва.


2
Хоча те, що ви кажете, технічно відповідає дійсності, стандарт вимагає, щоб long long був щонайменше 64 біт, і я не знаю жодної реалізації, яка визначає будь-який розмір, крім 64-бітового. Це може змінитися, коли вийдуть 128-розрядні компілятори, але для поточних компіляторів не потрібно розтягувати 64 біти.
Боаз Янів

2
+1, протидія "проти". Відповідь залежить від значення "є".
Енді Фінкенштадт,

3
@Andy: Білл Клінтон? Це ти? ;)
Джон Дайблінг

4
Це абсолютно не "Краса С ++", це цілковита біль: p
asimes

@MichaelBurr 8 років потому, я все ще ставлю під сумнів, що я роблю зі своїм життям, намагаючись зрозуміти, як наблизитись якомога ближче до того, що робить Руст із примусовими розмірами, принаймні з точки зору програміста, який виписав літерали, під час компіляції. Досі немає такої удачі. Такі речі - не що інше, як чиста агонія.
Sahsahae

15

Має бути не менше 64 біт. Крім того, що це визначено реалізацією.

Строго кажучи, unsigned long longне є стандартом для C ++, поки не буде стандартом C ++ 0x. unsigned long longє "специфікатором простого типу" для типу unsigned long long int(тому вони є синонімами).

long longБезліч типів також в C99 і було загальне розширення компіляторів C ++ ще до того , стандартизовані.


1
"Нещодавно затверджено?" Востаннє я перевіряв, що вони розглядали можливість перенести його на 2012 рік.
Фред Фу,


1
@ In silico: Я це читав. Я також десь читав про можливу затримку, але, чесно кажучи, не пам’ятаю, де.
Fred Foo

1
@larsmans: Якщо я не бачу офіційного джерела про затримку FDIS (запит у пошуковій системі щодо "C ++ 0x FDIS delay" не дає мені відповідних звернень), я повністю очікую, що стандарт буде опублікований у 2011 році, серйозні проблеми в незважаючи на сам стандарт.
In silico

1
@ In silico: Я також не знайшов посилання, тому, мабуть, це були або чутки, або непорозуміння з мого боку. Тим не менше, я не думаю, що статус FDIS такий самий, як повна ратифікація, чи не так?
Fred Foo

3

Використовуйте оператор sizeof, він дасть вам розмір типу, виражений у байтах. Один байт - це вісім бітів. Дивіться таку програму:

#include <iostream>

int main(int,char**)
{
 std::cout << "unsigned long long " << sizeof(unsigned long long) << "\n";
 std::cout << "unsigned long long int " << sizeof(unsigned long long int) << "\n";
 return 0;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.