সি / সি ++ এ দীর্ঘ দীর্ঘ


84

আমি জিএনইউর সি ++ সংকলকটিতে এই কোডটি চেষ্টা করছি এবং এর ব্যবহার বুঝতে অক্ষম:

#include <stdio.h>;

int main()
{
    int  num1 = 1000000000;
    long num2 = 1000000000;
    long long num3;
    //num3 = 100000000000;
    long long num4 = ~0;

    printf("%u %u %u", sizeof(num1), sizeof(num2), sizeof(num3));
    printf("%d %ld %lld %llu", num1, num2, num3, num4);
    return 0;
}

আমি যখন মন্তব্য করা লাইনটি অসম্পূর্ণ করি, কোডটি সংকলন করে না এবং একটি ত্রুটি দিচ্ছে:

ত্রুটি: দীর্ঘ ধরণের জন্য পূর্ণসংখ্যার ধ্রুবক খুব বড়

তবে, কোডটি যেমন হয় তেমন সংকলিত হয় এবং কার্যকর হয়, এটি 10000000000 এর চেয়ে অনেক বড় মান উত্পাদন করে।

কেন?


8
এখনই দেরি হতে পারে তবে ভবিষ্যতের পাঠকদের জন্য, আমি আপনাকে ব্যবহার <stdint.h>এবং ব্যবহারের পরামর্শ দিচ্ছি uint64_t। একটি 64 বিট মান প্রদর্শন করতে,printf( "%" PRIu64 "\n", val);
উত্সাহী

@enthusiasticgeek <stdint.h>অন্তর্ভুক্ত,uint64_t a = 0xffffffffffffff; printf( "%" PRIu64 "\n",a ); : error: expected ‘)’ before ‘PRIu64’ printf( "%" PRIu64 "\n",a ); :: warning: spurious trailing ‘%’ in format [-Wformat=] printf( "%" PRIu64 "\n",a );
রাখাল

উত্তর:


148

100000000000 বর্ণগুলি আক্ষরিক পূর্ণসংখ্যার ধ্রুবক তৈরি করে তবে মানটির জন্য মানটি খুব বড় int। আক্ষরিক ধরণের অর্থ পরিবর্তন করতে আপনাকে প্রত্যয় ব্যবহার করতে হবে

long long num3 = 100000000000LL;

প্রত্যয়টি LLআক্ষরিক আকারে পরিণত হয় long long। বাম দিক থেকে টাইপ থেকে এটি উপসংহারে সি যথেষ্ট "স্মার্ট" নয়, টাইপটি আক্ষরিক অর্থেই একটি সম্পত্তি, এটি যে প্রসঙ্গে ব্যবহৃত হচ্ছে তা নয়।


47
পিছনে যখন এই উত্তর লেখা হয়েছিল এটা সম্ভবত সঠিক ছিল, কিন্তু এখন C ++ স্ট্যান্ডার্ডের বলছেন যে কোন প্রত্যয় সঙ্গে একটি পূর্ণসংখ্যা আক্ষরিক ধরণ প্রথম int, long intএবং long long intযা এর মান প্রতিনিধিত্ব করা যেতে পারে। [সি ++ §২.১৪.২ / ২] অতএব এখন 'এলএল' প্রত্যয়টি কোনও পূর্ণসংখ্যার লিটারেলের সাথে যুক্ত করার দরকার নেই যা অন্য ধরণের জন্য খুব বড়।
bames53

8
এর আগে যে সমস্যাটি হয়েছিল তার কারণটি ছিল না কারণ সি ++ যে পরিমাণ ভেরিয়েবলকে নির্ধারিত হয়েছিল তা থেকে আক্ষরিক ধরণ নির্ধারণের জন্য যথেষ্ট 'স্মার্ট' ছিল না, এটি কেবল তখনই হত কারণ কম্পাইলার এক্সটেনশানটি বর্ধিত পূর্ণসংখ্যাকে বাস্তবায়ন করে না এটি প্রমিত ভাষার সাথে ভালভাবে কাজ করবে এমন টাইপ করুন। সি ++ এর এখন এমন নিয়ম রয়েছে যে কোনও বর্ধিত পূর্ণসংখ্যার ধরণের মানের সাথে আরও ভাল সংহত করতে হবে: ওপেন- std.org/jtc1/sc22/wg21/docs/papers/2006/n1988.pdf
bames53

4
@ আনউইন্ড আমি মনে করি এই পরামর্শগুলি অনুসারে উত্তরটি সম্পাদনা করা উচিত।
আন্তোনিও

26

চেষ্টা করুন:

num3 = 100000000000LL;

এবং বিটিডাব্লু, সি ++ এ এটি একটি সংকলক এক্সটেনশন, মান দীর্ঘ দীর্ঘ সংজ্ঞা দেয় না, এটি সি 99 এর অংশ।


11
ভাল, সি ++ 11 এখন দীর্ঘ দীর্ঘ সংজ্ঞা দেয়
মোহাম্মদ এল-নাকিব

4

আপনি কোন মোডটি সংকলন করছেন তা নির্ভর করে। দীর্ঘ দীর্ঘ সি ++ স্ট্যান্ডার্ডের অংশ নয় তবে কেবল (সাধারণত) এক্সটেনশন হিসাবে সমর্থিত। এটি আক্ষরিক প্রকারকে প্রভাবিত করে। কোনও প্রত্যয় ছাড়াই দশমিক পূর্ণসংখ্যার লিটারালগুলি সর্বদা টাইপ int হয় যদি সংখ্যাটি উপস্থাপনের জন্য যথেষ্ট বড় হয় , অন্যথায়। যদি সংখ্যাটি দীর্ঘ সময়ের জন্য আরও বড় হয় তবে ফলাফলটি বাস্তবায়ন-সংজ্ঞায়িত হয় (সম্ভবত পিছনের সামঞ্জস্যের জন্য সংক্ষিপ্ত আকারের বেশ কয়েকটি সংখ্যক টাইপ)। এই ক্ষেত্রে আপনাকে দীর্ঘ দীর্ঘ এক্সটেনশন সক্ষম করার জন্য স্পষ্টতই এলএল প্রত্যয় ব্যবহার করতে হবে (বেশিরভাগ সংকলকগুলিতে)।

পরবর্তী সি ++ সংস্করণটি আনুষ্ঠানিকভাবে দীর্ঘ দীর্ঘভাবে এমনভাবে সমর্থন করবে যে আপনি স্পষ্টভাবে আক্ষরিকরূপটি কমপক্ষে দীর্ঘ দীর্ঘ করতে বাধ্য না করা অবধি আপনার কোনও প্রত্যয় প্রয়োজন হবে না। সংখ্যাটি দীর্ঘায়িতভাবে প্রতিনিধিত্ব করতে না পারলে সংকলক স্বয়ংক্রিয়ভাবে এলএল প্রত্যয় ছাড়াই দীর্ঘ দীর্ঘ ব্যবহারের চেষ্টা করবে। আমি বিশ্বাস করি এটিও সি 99 এর আচরণ।


1

আপনার কোড এখানে সূক্ষ্ম সংকলন করে (এমনকি সেই লাইনটি নিরক্ষিত অবস্থায় রয়েছে it এটিতে পরিবর্তন করতে হয়েছিল

num3 = 100000000000000000000;

সতর্কতা পেতে শুরু।


কি সংকলন? সি ++-তে, পূর্ণসংখ্যার আক্ষরিকটি অন্তর্নিহিত বা দীর্ঘের চেয়ে ছোট আকারের হয় C C৯৯ এ এটি দীর্ঘতম, দীর্ঘ, দীর্ঘতম দীর্ঘতম। সুতরাং যখন অ-মানক এক্সটেনশান হিসাবে সি ++ এ দীর্ঘ দীর্ঘায়িত হন, সম্ভবত আপনার সংকলকটি আক্ষরিক জন্য C99 বিধিও গ্রহণ করেছে।
স্টিভ জেসোপ

জিসিসি সংস্করণ একটি bit৪ বিট লিনাক্স সিস্টেমে ৪.৩.২ (ডেবিয়ান 4.3.2-1.1)।
ওমরি ইয়াদান

@ স্টেভ জেসপ সম্ভবত খানিকটা দেরি করুন: তবে অগত্যা 64 বিট দীর্ঘ নয়। বেশিরভাগ সময় এটি হয় তবে আপনার কোনও গ্যারান্টি নেই যে এটি সর্বত্রই থাকবে। আপনার কাছে কেবল গ্যারান্টিটি হ'ল এটি অন্তত অন্তত একটি ইন্টের মতো বড়, যার পরিবর্তে কমপক্ষে একটি শর্ট ইনট হিসাবে বড় হয়, যার ফলস্বরূপ কমপক্ষে একটি চরের মতো কম big পরিশেষে, চরটি বাস্তবায়নের প্রাথমিক চরসেটে (সাধারণত 8-বিট) প্রতিটি অক্ষরকে উপস্থাপন করতে যথেষ্ট বড় হিসাবে সংজ্ঞায়িত হয় ।
pauluss86

@ পাউলুস ৮86: আমি গ্যারান্টি নিয়ে কথা বলছিলাম না। ওমরি বলেছিলেন যে তিনি একটি 64 বিট দেবিয়ান সিস্টেমে জিসিসি 4.3.2 ব্যবহার করেছিলেন। আমি পর্যবেক্ষণ করেছি যে এটি যেহেতু তিনি যা দেখছিলেন তা ব্যাখ্যা করেছে (সাধারণ জ্ঞানের বিষয় হিসাবে আমি জানতে পেরেছি) longজিসিসি এই সিস্টেমের ডিফল্টরূপে OS৪ বিটের সাথে ওএসের এলপি a৪ এবিআইয়ের সাথে সামঞ্জস্য রেখে কনফিগার করা হয়েছে।
স্টিভ জেসোপ

@ স্টিভ জেসপ আমি আপনার মন্তব্যটি ভুল বলে প্রস্তাব দিচ্ছি না! কেবল এটিই ইঙ্গিত করে যে দীর্ঘকাল সর্বদা সর্বদা b৪ বিট থাকে এমন অনুমানটি দুর্ভাগ্যক্রমে অনেক লোক মনে করে যে এটি বিপজ্জনক।
pauluss86
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.