Ці з'яўляецца `short` гэтак жа, как` int` ў C ++?

Я паглядзеў на некаторыя адказы, якія выкарыстоўваюць кароткі ў C#, але я не ўпэўнены, калі яны на самой справе адказаць на маё пытанне тут. Ці з'яўляецца кароткі у C ++ іншага імя для Int ? Я ведаю, што вы можаце зрабіць кароткі Int , які, здаецца, каб быць у стане апрацоўваць шмат значэнняў, але я ўсё яшчэ пачынаў, так што, відавочна, калі гэта кароткі гэта не шмат каштоўнасцяў. Але ў гэтым фрагменце кода тут:

short lives,aliensKilled;

ён не выкарыстоўвае Int кароткі , ён проста выкарыстоўвае кароткі . Так што я думаю, маё пытанне, ці магу я проста выкарыстоўваць кароткі у якасці замены для Int калі я не буду пад 32768 або больш 32767?

Акрамя таго, гэта добра, каб проста замяніць кароткі з Int , і гэта будзе на самой справе не важдацца з чым-небудзь да таго часу, як я змяніць адпаведныя рэчы? (Btw жыве і aliensKilled з'яўляюцца імёны зменных.)

1
Няма. <�Код> кароткі 2 байта, Int 4 байта. Дыяпазоны, што кожны з іх можа захоўваць розныя.
дададзена аўтар Maria Ines Parnisari, крыніца
Гэта залежыць ад кантэксту. У C, з кодам <> Int гарантавана будзе па меншай меры 16-біт цэлы лік. У гэтыя дні, часцей за ўсё 32-разраднае цэлы лік, але стандарт C не патрабуе, каб і было б мэтазгодна, каб мець Int у якасці 64-бітавага колькасці на 64-бітнай машыне. Гэта звычайна не робіцца, але гэта можа быць зроблена - і будзе адпавядаць стандарту C.
дададзена аўтар Jonathan Leffler, крыніца
@RobertMichaud: Для рэчаў, якія адбываюцца ў тысячы разоў (вялікія табліцы), з выкарыстаннем меншага тыпу мае сэнс. Для двух зменных, якія прадстаўляюць колькі жыццяў вы пакінулі або колькі замежнікаў вы забілі ў «прасторы-гульні» захавае, магчыма, 4 байта. Ні ў чым, але вельмі старой сістэме, што няма нічога. Нават калі я пачаў працаваць на кампутарах ў 1985 годзе, быў 64KB аператыўнай памяці ў сістэме. Хутка будзе пашырана да 256 Кбайт ці больш.
дададзена аўтар Mats Petersson, крыніца
@ L19 няма нічога, што кажа, што Int павінен быць 4 байта.
дададзена аўтар juanchopanza, крыніца
@Mats Петэрсана Ах, добра. Нехта там сказаў ИНТ варта проста ўвогуле выкарыстоўваць для чаго-небудзь, так што я думаю, я проста выкарыстаць. Гэта проста прыклад у кнізе, так што я быў крыху збянтэжаны, але я мяркую, што гэта проста паказвае прыклад таго, што вы можаце зрабіць. Я не планую рабіць нічога вялізнага (пакуль), таму я не турбуюся пра гэта. Дзякуй за інфармацыю!
дададзена аўтар Setari, крыніца
Ці з'яўляецца гэта ўвогуле праблема для праграмістаў/відэа вытворцаў гульняў тады? Як кажуць, што яны выкарыстоўваюць Int у кодзе замест выкарыстання кароткі , дзе яно можа быць выкарыстана, было б зрабіць для больш грувасткіх праграмы/гульні, калі я лавіць гэта правільна? Ці гэта аб'ём аператыўнай памяці патрабуецца, каб "запусціць" праграму?
дададзена аўтар Setari, крыніца
Так што, калі я стаўлю Int кошт , а затым адзнака = 0; , што 1 байт дадзеных, таму што гэта толькі адна лічба? Ці гэта аўтаматычна 4 байта?
дададзена аўтар Setari, крыніца

7 адказы

У C ++ (і C), кароткі , кароткі ИНТ і INT кароткі розныя назвы аднаго і таго ж тыпу. Гэты тып гарантавана мець дыяпазон прынамсі -32,767 .. + 32767. (Не, гэта не памылка друку.)

У большасці сучасных сістэм, кароткі 16 біт і Int 32 біта. Вы можаце замяніць Int з кароткі без негатыўных наступстваў да таго часу, пакуль вы не перавышае радыус дзеяння кароткі . У большасці сучасных сістэм, які перавышае радыус дзеяння кароткі звычайна прыводзіць значэння обцяканьне-гэта паводзіны <�ет> не гарантуецца стандартам, і вы павінны не спадзявацца на яго, асабліва цяпер, калі агульны C ++ кампілятары будуць падрэзаць шляху кода, якія ўтрымліваюць падпісаныя цэлалікавых перапаўненне.

Аднак, у большасці выпадкаў, існуе мала карысці для замены Int з кароткі . Я б толькі замяніць Int з кароткі калі б я меў па меншай меры, тысячы з іх. Там не заўсёды перавага, выкарыстоўваючы кароткі вы можаце паменшыць аб'ём памяці, які выкарыстоўваецца і прапускной здольнасці, неабходнай, але вы можаце патэнцыйна павялічыць колькасць цыклаў працэсара, неабходных для пераўтварэння з <�код > кароткі у Intкароткі заўсёды "павышаны" ў Int , калі вы робіце арыфметычныя аперацыі на ім).

5
дададзена
@Setari: Я б не пайсці так далёка. Мой вопыт паказвае, што, як правіла, гэта не варта таго, каб паспрабаваць і ацаніць, які з іх лепш для вашага канкрэтнага прымянення, таму што Int дастаткова добра 99% часу.
дададзена аўтар Dietrich Epp, крыніца
@BalogPal Я лічу, што гэта на самай справе не мае значэння, калі адзін выкарыстоўваць кароткі або Int у структурах, калі гэта не на невялікіх ўбудаваных сістэм (ці 20 гадоў старых кампутараў) або бінарнае пратаколы/фарматы файлаў. Замест таго, каб ісці на павялічаную далёкасць і меншую верагоднасць над/пад перспектывай.
дададзена аўтар Some programmer dude, крыніца
Такім чынам, сіметрычная дыяпазон ( "не памылка друку ...»), каб для розных падпісаных цэлалікавых уяўленняў?
дададзена аўтар juanchopanza, крыніца
Яшчэ адна прычына аддаць перавагу ИНТ на кароткі, што арыфметыка трусах выклікае аперанды прайсці прасоўванне, якое можа прывесці да нечаканых вынікаў.
дададзена аўтар Oliver Charlesworth, крыніца
дыяпазон REQ мінімальная, і свая рэалізацыя камлементу б у рэальнай бядзе інакш
дададзена аўтар Balog Pal, крыніца
Выкарыстоўваючы кароткі мае сэнс, калі гэта член структуры ў многіх выпадках, скажам, у вас ёсць два з іх.
дададзена аўтар Balog Pal, крыніца
@juanchopanza: Так.
дададзена аўтар TonyK, крыніца
О, добра. Гучыць добра тады. Дзякуй!
дададзена аўтар Setari, крыніца
Так што гэта проста лепш выкарыстоўваць Int за ўсё тое?
дададзена аўтар Setari, крыніца

short int, int short and short are all synonymous in C and C++.

Гэтыя працы, як Int , але дыяпазон менш (як правіла, але не заўсёды) 16 біт. Да таго часу, пакуль ні адзін з кодаў не залежыць ад пераходаў, калі колькасць «абцякае» з-за яго 16 біт (гэта значыць, вылічэнні не апынецца вышэй верхняга значэння (SHORT_MAX) або ніжэй мінімальнага значэння (SHORT_MIN)), з выкарыстаннем больш тыпу ( Int , доўгі ) будзе працаваць нармальна.

2
дададзена
@TonyK: Вы, верагодна, з усіх сіл, каб знайсці адзін, але ў 36-бітнай сістэме IBM або снежань мэйнфрэймаў, я ўпэўнены, што гэта 18 біт ...
дададзена аўтар Mats Petersson, крыніца
@TonyK: Тыпы ў C і C ++ вызначаны шляхам «павінны быць па меншай меры такім вялікім». Гэта можа быць больш. <�Код> кароткі таксама не павінен быць «больш», чым Int , але гэта можа быць той жа памер. <�Код> доўгі можа быць такім жа памерам, як паміж, і гэта цалкам дапушчальна, каб мець усе тры сапраўды такі ж памер. Калі ваш код належыць на «гэты лік павінна мець такую ​​колькасць бітаў, ці ўсё пойдзе не так» (напрыклад, чакаючы перацякае мець пэўныя паводзіны), ёсць тыпы, такія як int16_t і int32_t </код > якія існуюць толькі ў тым выпадку, што канкрэтны памер сапраўдны на гэтым кампілятарам.
дададзена аўтар Mats Petersson, крыніца
Хіба гэта не патрабаванне, што кароткі будзе <�я> прынамсі 16 біт (на аснове мінімальнага дыяпазону яна павінна ахопліваць)?
дададзена аўтар juanchopanza, крыніца
Вы кажаце, што «як правіла, але не заўсёды». Ці правільна гэта? Я згодны, што рэалізацыі не абавязаны зрабіць іх кароткія тып 16 біт - але ці ёсць там?
дададзена аўтар TonyK, крыніца
Так, але маё пытанне: ці ёсць нейкія кампілятары якіх кароткі ня 16 біт?
дададзена аўтар TonyK, крыніца

short can at max be two bytes long. On machines where int is two bytes, short and int have same range i.e. -32767 to +32767. For most of the new platforms, int is 4 bytes, catering to much larger range of values.

Я рэкамендую пайсці на яўнага ўказанні, такія як int16_t для сцісласці і int32_t для міжнар, каб пазбегнуць блытаніны.

2
дададзена
Ён нават можа быць адзін байт. Павінна быць два актэта, хоць і байты звычайна актэт.
дададзена аўтар MSalters, крыніца
<�Код> кароткі можа быць даўжынёй больш за два байтаў. <�Код> Int проста павінен быць, па меншай меры да таго часу, як кароткі .
дададзена аўтар juanchopanza, крыніца
@juanchopanza Я ніколі не сустракаў больш чым у два байта кароткіх, любая спасылка дапаможа. Я згодны з другой часткай (Int, па меншай меры да таго часу, як кароткія), і мой адказ таксама кажа нешта падобнае.
дададзена аўтар Amit, крыніца

Таксама зьвярніце ўвагу, што для наступнага коду:

short a = 32767;
a++;
cout << a;

Ён будзе друкаваць -32.768.

Так што, калі вы ідзяце па сваёй мяжы, ён будзе «вярнуцца» з падлікам.

2
дададзена
@Vlad Даволі дрэннае можа здарыцца, калі вы спрабуеце выкарыстоўваць нявызначаны паводзіны, нават у выпадку падпісанага цэлалікавага перапаўнення: stackoverflow.com/questions/7682477/…
дададзена аўтар jogojapan, крыніца
Гэта тэхнічна нявызначаны паводзіны.
дададзена аўтар Dietrich Epp, крыніца
Там няма ніякай гарантыі, што не будзе памылкай; кампілятар можа арганізаваць перафарматаваць дыск. Гэта, верагодна, не будзе, але нявызначаны паводзіны не вызначана; усё можа здарыцца.
дададзена аўтар Jonathan Leffler, крыніца
Калі перапаўненне 16-разраднае цэлы лік, паводзіны не вызначана. Тое, што вы паказаць найбольш агульны вынік; гэта не ў нейкім сэнсе гарантаваны вынік.
дададзена аўтар Jonathan Leffler, крыніца
Звярніце ўвагу, што калі SizeOf (кароткі) , некаторыя кампілятары, як GCC гарантуем гэта паводзіны, у той час як яны не Int а = INT_MAX; A ++ .
дададзена аўтар Marc Glisse, крыніца
@JonathanLeffler: Вядома, гэта не так, я проста хацеў, каб паказаць яму, што ён не атрымлівае якую-небудзь памылку (напрыклад, <�б> забіў сігналу , напрыклад).
дададзена аўтар Vlad Tarniceru, крыніца

C ++ (і C# іobjective-cі іншыя прамыя нашчадкі C) маюць мудрагелісты спосаб наймення і вызначэння цэлалікавых прымітыўныя тыпаў.

Як паказана ў C ++, кароткі і Int з'яўляюцца проста тыпу спецификаторы , якія могуць быць змяшаныя і падабраныя разам з ключавымі словамі доўгі , падпісаны і беззнаковое у любой старонкі набіты камбінацый.

Агульная схема для аднаго тыпу кароткі INT гэта [подпіс] кароткі [INT] , які павінен сказаць падпісанага і Int ключавыя словы не з'яўляюцца абавязковымі.

Note that even if int and short are the same size on a particular platform, they are still different types. int has at least the same range as short so it's numerically a drop-in replacement, but you can't use an int * or int & where a short * or short & is required. Besides that C++ provides all kinds of machinery for working with types… for a large program written around short, converting to int may take some work.

Заўвага няма таксама, што не існуе перавага абвясціць нешта кароткі , калі вы на самой справе няма прычын, каб зэканоміць некалькі байт. Гэта дрэнны стыль і прыводзіць да перапаўнення памылак, і нават можа прывесці да зніжэння прадукцыйнасці, як працэсары сёння не аптымізаваныя для 16-бітных аперацый. І як Dietrich нот, у адпаведнасці з вар'ятам чынам пазначаны C арыфметыка семантыка, то кароткі з'яўляецца вентыляцыйны для Int , перш чым якая-небудзь аперацыя выконваецца, а затым, калі вынік прысвойваецца назад а кароткі , ён кінуў назад. Гэты танец, як правіла, не мае ніякага эфекту, але ўсё яшчэ можа прывесці да папярэджанняў кампілятара і горш.

In any case, the best practice is to typedef your own types for whatever jobs you need done. Always use int by default, and leverage int16_t, uint32_t from ( since C++11), etc instead of relying on platform-dependent short and long.

1
дададзена

Так, вы можаце выкарыстоўваць яго. кароткая = кароткая унутр. Подпіс ад -32768 да 32767 і без знака ад 0 да 65535.

1
дададзена

Так, кароткі эквівалентны кароткім міжнар, і ён выкарыстоўвае прынамсі, 2 байта, але калі вы застаецеся ў дыяпазоне вы можаце замяніць Int з кароткім без якіх-небудзь праблем.

0
дададзена