कितने बाइट्स लंबे समय तक अहस्ताक्षरित हैं?


84

कितनी बाइट है unsigned long long ? क्या यह वैसा ही है unsigned long long int?


52
आकार (लंबे समय तक अहस्ताक्षरित) करें।
कम्युनिस्ट डक


2
सी और सी ++ मानकों को उन संख्याओं के साथ सामान को अपनाना चाहिए, जिस तरह से संकलक स्वचालित रूप से चुनता है। फ्लोट 32, फ्लोट64, इंट 32, आदि जैसे कुछ भी हमें जिस भी सीमा तक की आवश्यकता है, int256 याat1024 के बारे में क्या? ... यह वास्तव में दर्द को दूर करेगा ...
जोकॉन

2
@gokoon: के रूप में मैं अपने जवाब में बताया गया है, सी मानक पहले से ही है int32_t, uint64_tआदि सी ++ उन्हें आगामी मानक के साथ प्राप्त होगा। वे हेडर में हैं <stdint.h>
फ्रेड फू

1
फ्लोट और डबल के बारे में क्या?
jokoon

जवाबों:


82

कार्यकारी सारांश: यह 64 बिट्स, या बड़ा है।

unsigned long longके रूप में ही है unsigned long long int। इसका आकार प्लेटफ़ॉर्म-निर्भर है, लेकिन सी मानक (आईएसओ C99) द्वारा कम से कम 64 बिट होने की गारंटी है। long longC89 में कोई नहीं था , लेकिन जाहिरा तौर पर MSVC भी इसका समर्थन करता है, इसलिए यह काफी पोर्टेबल है।

वर्तमान सी ++ मानक (2003 में जारी) में, कोई भी नहीं है long long, हालांकि कई संकलक इसे विस्तार के रूप में समर्थन करते हैं। आगामी C ++ 0x मानक इसका समर्थन करेगा और इसका आकार C के समान होगा, इसलिए कम से कम 64 बिट्स।

आप अभिव्यक्ति के साथ बाइट्स (विशिष्ट प्लेटफार्मों पर 8 बिट्स) में सटीक आकार प्राप्त कर सकते हैं sizeof(unsigned long long)। यदि आप वास्तव में 64 बिट चाहते हैं, तो उपयोग करें uint64_t, जो <stdint.h>संबंधित प्रकारों के एक समूह (C99, C ++ 11 और कुछ वर्तमान C ++ कंपाइलर में उपलब्ध) के साथ हेडर में परिभाषित किया गया है ।


2
@ लार्स: sizeof(char) वास्तव में एक लौटने की गारंटी है । यह रिटर्न करता है कि ऑपरट कितना बाइट्स की संख्या में है, न कि "चार इकाइयों" की संख्या में। इसलिए, हर प्लेटफ़ॉर्म पर इसकी बाइट्स पर "बाइट्स नहीं"।
जॉन डिब्लिंग

1
@ जॉन: जो बाइट की परिभाषा पर निर्भर करता है । यदि आप बराबर charऔर बाइट करते हैं, तो आप सही हैं। यदि आप समान charऔर अष्टक करते हैं , तो यह भिन्न होता है।
फ्रेड फू

4
@ लार्स: नहीं, यह नहीं है। हर मंच पर एक चार हमेशा एक बाइट होता है। मानक बाइट में कितने बिट्स हैं, यह निर्दिष्ट नहीं करता है, लेकिन यह एक अलग बात है। एक कार्यान्वयन 64 बिट बाइट्स का उपयोग कर सकता है, जिसके परिणामस्वरूप sizeof(long long) == 1और वह अनुरूप होगा।
जॉन डिब्लिंग

1
@ लार्स: मैंने पहले से ही आपको वैसे भी उखाड़ फेंका है, लेकिन यहाँ एक नीपिक है: "सी मानक (आईएसओ सी 99) द्वारा गारंटीकृत कम से कम 64 बिट्स == 8 बाइट्स" मैं एक गैर-एम्बेडेड दुनिया की कल्पना नहीं कर सकता जिसमें 64 बिट्स! = 8 बाइट्स, लेकिन मानक इसकी गारंटी नहीं देता है।
जॉन डिब्लिंग 20

@ जॉन: फिर से। पहले से ही मैं भाषा वकील मोड में 64 बिट्स == 8 बाइट्स हटा चुका हूं। और मैंने सुना है कि वास्तव में एम्बेडेड प्लेटफॉर्म हैं जहां एक बाइट 16 बिट्स है।
फ्रेड फू

17

C की तरह C ++ की सुंदरता यह है कि इन चीजों का आकार कार्यान्वयन-परिभाषित है, इसलिए आपके द्वारा उपयोग किए जा रहे कंपाइलर को निर्दिष्ट किए बिना कोई सही उत्तर नहीं है। क्या वे दोनों एक ही हैं? हाँ। "लॉन्ग लॉन्ग" किसी भी कंपाइलर के लिए "लॉन्ग लॉन्ग इंट" का पर्याय है जो दोनों को स्वीकार करेगा।


2
जबकि आप जो कहते हैं वह तकनीकी रूप से सत्य है, मानक के लिए आवश्यक है कि लंबे समय तक कम से कम 64 बिट लंबा होना चाहिए , और मुझे किसी भी कार्यान्वयन के बारे में पता नहीं है जो 64-बिट के अलावा किसी भी आकार को परिभाषित करता है। 128-बिट कंपाइलर के बाहर आने पर यह बदल सकता है, लेकिन वर्तमान कंपाइलर्स के लिए यह 64 बिट्स मानने के लिए खिंचाव नहीं है।
बोअज़ यानि

2
+1, डाउनवोट का मुकाबला करना। उत्तर meaning है ’के अर्थ पर निर्भर करता है।
एंडी फिन्केनस्टैड

3
@ एंडी: बिल क्लिंटन? क्या वे तुम हो? ;)
जॉन डिब्लिंग

4
यह बिल्कुल "C ++ की सुंदरता" नहीं है, यह एक पूर्ण दर्द है: p
asimes

@MichaelBurr 8 साल बाद, मैं अभी भी सवाल कर रहा हूं कि मैं अपने जीवन के साथ क्या कर रहा हूं, यह पता लगाने की कोशिश कर रहा हूं कि रुस्त के साथ जितना संभव हो उतना करीब कैसे हो सकता है, यह कम से कम प्रोग्रामर के परिप्रेक्ष्य से टाइप के आकार को मजबूर करता है जिसने लिखा था संकलन के समय, शाब्दिक। फिर भी ऐसी किस्मत नहीं। इस तरह की चीजें शुद्ध पीड़ा के अलावा और कुछ नहीं हैं।
सहसहाय

15

यह कम से कम 64 बिट का होना चाहिए। इसके अलावा यह क्रियान्वित परिभाषित है।

सख्ती से, unsigned long longC ++ 0x मानक तक C ++ में मानक नहीं है। unsigned long longप्रकार के लिए एक 'सरल-प्रकार-विशेष' हैunsigned long long int (इसलिए वे समानार्थी हैं)।

long longप्रकारों का सेट C99 में भी है और यहां तक कि मानकीकृत किया जा रहा से पहले सी ++ compilers के लिए एक आम विस्तार था।


1
"हाल ही में पुष्टि की?" पिछली बार जब मैंने जाँच की तो वे इसे 2012 में स्थगित करने पर विचार कर रहे थे।
फ्रेड फू


1
@ इन सिलिको: मैंने पढ़ा है कि। मैंने एक संभावित देरी के बारे में भी कहीं पढ़ा है, लेकिन मैं ईमानदारी से याद नहीं कर सकता कि कहाँ है।
फ्रेड फू

1
@ लार्समैन: जब तक मुझे एफडीआईएस के बारे में एक आधिकारिक स्रोत देखने में देरी हो रही है ("सी ++ 0x एफडीआईएस देरी के लिए एक खोज इंजन क्वेरी" मुझे कोई प्रासंगिक हिट नहीं देता है), मैं पूरी तरह से मानक 2011 में प्रकाशित होने की उम्मीद करता हूं, गंभीर मुद्दे मानक खुद के बावजूद।
सिलिको में

1
@ इन सिलिको: मुझे संदर्भ नहीं मिला है, इसलिए मुझे लगता है कि यह मेरी ओर से एक अफवाह या गलतफहमी थी। फिर भी, मुझे नहीं लगता कि FDIS की स्थिति पूर्ण अनुसमर्थन के समान है, यह है?
फ्रेड फू

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.