জাভার এল নম্বর (দীর্ঘ) স্পেসিফিকেশন


96

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

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

উত্তর:


178

long(উদাহরণস্বরূপ 39832L), float(উদাহরণস্বরূপ 2.4f) এবং double(উদাহরণস্বরূপ -7.832d) এর জন্য নির্দিষ্ট প্রত্যয় রয়েছে ।

যদি প্রত্যয় না থাকে এবং এটি একটি অবিচ্ছেদ্য প্রকার (যেমন 5623) হয় তবে এটি একটি হিসাবে ধরে নেওয়া হয় int। যদি এটি অবিচ্ছেদ্য প্রকার নয় (যেমন 3.14159), তবে এটি একটি হিসাবে ধরে নেওয়া হয় double

অন্যান্য সব ক্ষেত্রে ( byte, short, char), আপনি ঢালাই প্রয়োজন হিসাবে কোন নির্দিষ্ট সাফিক্স।

জাভা স্পেসটি উচ্চ এবং নিম্ন উভয় ক্ষেত্রেই প্রত্যয়কে অনুমতি দেয়, তবে এর ক্ষেত্রে উচ্চ বর্ণের সংস্করণ longপছন্দ হয়, কারণ উপরের ক্ষেত্রে নিম্নের ক্ষেত্রে Lএকটি সংখ্যার সাথে বিভ্রান্ত করা কম সহজ ।1l

দেখুন JLS অধ্যায় 3.10 রক্তাক্ত বিবরণ (সংজ্ঞা দেখতে জন্য IntegerTypeSuffix)।


9
দেরিতে প্রবেশ: অস্পষ্টতার সম্ভাব্য উত্সগুলি সরিয়ে ফেলা সর্বদা ভাল, এবং আমি একমত নই ... তবে আমি বিশ্বাস করি যদি আপনি নিজেকে বিভ্রান্ত মনে 1করেন lএবং এর 0সাথে O(এবং আরও কিছু), আপনার অগ্রাধিকার হ'ল ফন্টটি ঠিক করা (যদি আপনি পারেন তবে) ), তারপরে আপনি শিফট কীটি মিস করবেন না তা নিশ্চিত করার বিষয়ে চিন্তা করুন।
ডেভিডেসারিনো

@ সিমননিকারসন আমার প্রত্যয় সম্পর্কে একটি প্রশ্ন আছে ... আমি যদি দীর্ঘ বা ডাবল ভেরিয়েবলের মতো ঘোষণা করি : long _lo = 30;এবং এর 30Lঅর্থ কি এই নয় যে আমার ভেরিয়েবলটি ফ্লোটে রূপান্তরিত হবে ? অথবা ক্ষেত্রে _lo = _lo + 2.77যে _loবা casted করা হবে ভাসা যদিও এটি হিসাবে মনোনীত হন দীর্ঘ
luigi7up

না, ভাসমানগুলি এখানে জড়িত নয়। প্রথম ক্ষেত্রে, 30এটি এমন একটি intযা স্বয়ংক্রিয়ভাবে একটিকে প্রস্থের রূপান্তরের মাধ্যমে রূপান্তরিত হয় long। দ্বিতীয় ক্ষেত্রে, আপনার বক্তব্য অবৈধ। আপনাকে ডান হাতটি সুস্পষ্টভাবে দীর্ঘায়িত করতে হবে, উদাহরণস্বরূপ_lo = (long) (_lo + 2.77)
সাইমন নিক্কারসন

4
@ ডেভিডসেসারিনো ফন্ট পরিবর্তন করা আপনার জন্য অস্পষ্টতা ঠিক করে - সেই নির্দিষ্ট সম্পাদক যেখানে আপনি এটি ঠিক রেখেছেন। এল-তে পরিবর্তন করা আপনার প্রত্যেকটির জন্য অস্পষ্টতা সংশোধন করে যে আপনি যখন নিজের কোডটি অন্য সম্পাদক, আইডিই-তে ওয়েবে পড়ছেন তখন ওয়েবে উত্সটি দেখে (পর্যালোচনা সরঞ্জাম, সংগ্রহস্থল, ইত্যাদি) yourself আইএমএইচও অগ্রাধিকারটি শিফট কীটি মিস করা নয়। বিটিডব্লিউ আপনি কোন ফন্ট সুপারিশ করবেন? আমি মনোস্পেস পছন্দ করি এবং এটি প্রায় সমস্ত সম্পাদক, সিএলআই ইত্যাদির মধ্যে ডিফল্ট যা আমি দেখেছি এবং এই ফন্টে lএবং 1( 0এবং Oশ্রদ্ধা) মোটামুটি একই রকম।
ডিঙ্গলপাদুম

4
@dingalapadum যেমনটি আমি বলেছি, আপনি ঠিক বলেছেন। অস্পষ্টতার উত্সগুলি অপসারণ করা অবশ্যই একটি সঠিক জিনিস। আমি কেবল বলেছি যে কোনও সম্পাদক আপনি যাতে সহজেই তাদের ভুল করতে পারেন সেগুলি ব্যবহার না করার চেষ্টা করা উচিত। অন্য কথায়, ডিফেন্সিয়ালি কোডিংয়ের পুরানো পরামর্শ, তবে এটির উপর নির্ভর করে না। হরফ সম্পর্কে, এটি খুব ব্যক্তিগত, তবে আমি সর্বদা দেজা ভান সানস মনো ব্যবহার করি যখনই আমি পারি কারণ 1) এটি মনোপ্রেসযুক্ত; 2) এটির চরিত্রগুলির মধ্যে অস্পষ্টতা নেই; এবং 3) আমি এর আকারগুলি, সুন্দর এবং কৃপণতা পছন্দ করি, প্রায় একটি ভাল, পঠনযোগ্য সং-সিরিফ ফন্টের মতো (অন্যান্য ভাল প্রোগ্রামিং ফন্টগুলি খুব "ধাতব" আইএমএইচও অনুভব করে)।
ডেভিডেসারিনো

13

আমি আশা করি আপনি কিছুটা স্পর্শকাতর হয়ে উঠবেন না, তবে ভেবেছিলেন যে আপনি এটি জানতে আগ্রহী হতে পারেন F(ভাসমানের জন্য), D(দ্বিগুণ জন্য) এবং L(দীর্ঘকাল ধরে) এবং যথাক্রমে এবং - এবং যথাক্রমে প্রত্যয় যুক্ত করার প্রস্তাব করা হয়েছে । এটি বাইট (বা সংক্ষিপ্ত) অ্যারেগুলির জন্য আক্ষরিক সিনট্যাক্স ব্যবহার করার সময় বাইটগুলিতে কাস্ট করার প্রয়োজনীয়তা হ্রাস করবে। প্রস্তাবনা থেকে উদাহরণ উদ্ধৃত:byteshortYS

প্রধান সুবিধা: প্রস্তাব গৃহীত হলে প্ল্যাটফর্মটি কেন ভাল?

ক্রুডি কোড পছন্দ

 byte[] stuff = { 0x00, 0x7F, (byte)0x80,  (byte)0xFF};

হিসাবে recoded করা যেতে পারে

 byte[] ufum7 = { 0x00y, 0x7Fy, 0x80y, 0xFFy };

জো ডারসি জাভা 7 প্রকল্প মুদ্রা অধীক্ষা করা হয়, এবং তার ব্লগে এই প্রস্তাব ট্র্যাক একটি সহজ উপায় হয়েছে।


এটি দুর্দান্ত হবে ... আমি সর্বদা খুঁজে পেয়েছি যে সমস্ত
ক্যাসেট

আমি এটি এটি জাভা into হিসাবে তৈরি করি নি Any এ কোনও শব্দ এটি ভবিষ্যতের আপডেট বা জাভা ৮ এ পরিণত করবে কিনা?
পিষ্ট করুন

@ ক্রাশ আমি কয়েক মাস আগে এটি সন্ধান করার চেষ্টা করেছি এবং যতদূর আমি বলতে পারি, প্রস্তাবটি বাতিল করে দেওয়া হয়েছিল। 0bযদিও আমরা বাইনারি আক্ষরিক জন্য সংখ্যাযুক্ত আক্ষরিক এবং উপসর্গ পেয়েছি। হুফ
ইরিকসন

এই প্রস্তাবগুলি সম্ভবত জাবার পরিবর্তে কোটলিনে প্রয়োগ করা হয়েছে, কারণ ওরাকল চায় না যে সম্প্রদায় কীভাবে কাজ করবে তা তাদের জানায় ... আমরা 2018 এ আছি এবং এখনও এই প্রস্তাব সম্পর্কে কিছুই নেই, দুঃখের সাথে
জোয়েলবনেটআর

11

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

প্রাক্তন:

byte b = 130; // CE: range is exceeding.

এই সঞ্চালন টাইপ ingালাই কাটিয়ে উঠতে।

byte b = (byte)130; //valid, but chances of losing data is there.

দীর্ঘ ডেটা টাইপের ক্ষেত্রে, এটি কোনও ঝামেলা ছাড়াই পূর্ণসংখ্য মানটি গ্রহণ করতে পারে। ধরা যাক আমরা যেমন নির্ধারিত

Long l = 2147483647; //which is max value of int

এই ক্ষেত্রে এল / এল এর মতো প্রত্যয় প্রয়োজন হয় না। ডিফল্ট মান দ্বারা 2147483647 জাভা সংকলক দ্বারা অন্তর্ভুক্ত টাইপ বিবেচনা করা হয়। অভ্যন্তরীণ ধরণের ingালাই সংকলক দ্বারা সম্পন্ন হয় এবং ইন্ট দীর্ঘতর প্রকারে স্বয়ংক্রিয়ভাবে প্রচারিত হয়।

Long l = 2147483648; //CE: value is treated as int but out of range 

শাব্দিক 2147483648 জাভা সংকলক দ্বারা দীর্ঘ টাইপ হিসাবে চিকিত্সার জন্য আমাদের এল হিসাবে প্রত্যয় লাগাতে হবে।

তাই শেষ পর্যন্ত

Long l = 2147483648L;// works fine.


1

দেখে মনে হচ্ছে এগুলি ভাল হবে কারণ (আমি ধরে নিই) আপনি যে সংখ্যাটি টাইপ করছেন তা যদি সংক্ষিপ্ত উল্লেখ করতে পারেন তবে জাভা এটি কাস্ট করতে হবে না

যেহেতু আক্ষরিক পার্সিং সংকলনের সময়ে ঘটে তাই পারফরম্যান্সের ক্ষেত্রে এটি একেবারেই অপ্রাসঙ্গিক। থাকার shortএবং byteপ্রত্যয়গুলি সুন্দর হওয়ার একমাত্র কারণ হ'ল এটি আরও কমপ্যাক্ট কোডের দিকে নিয়ে যায়।


0

আক্ষরিক intএবং longআক্ষরিকের মধ্যে পার্থক্য করা কেন প্রয়োজন তা বুঝতে , বিবেচনা করুন:

long l = -1 >>> 1;

বনাম

int a = -1;
long l = a >>> 1;

এখন আপনি যেমনটি সঠিকভাবে প্রত্যাশা করবেন, উভয় কোড টুকরা ভেরিয়েবলকে একই মান দেয় l। পার্থক্য করতে সক্ষম হচ্ছে না intএবং longলিটারেল, ব্যাখ্যার কি -1 >>> 1?

-1L >>> 1 // ?

বা

(int)-1 >>> 1 // ?

সংখ্যাটি সাধারণ ব্যাপ্তিতে থাকলেও আমাদের প্রকারটি নির্দিষ্ট করতে হবে। যদি ডিফল্টটি আক্ষরিক মাত্রার সাথে পরিবর্তিত হয়, তবে কেবল অঙ্কগুলি পরিবর্তন করা থেকে অভিব্যক্তিগুলির ব্যাখ্যাগুলিতে একটি অদ্ভুত পরিবর্তন হবে।

এই জন্য ঘটবে না byte, shortএবং charকারণ তারা সবসময় গাণিতিক এবং bitwise অপারেশন সম্পাদন আগে উন্নীত করা হয়। তাত্ক্ষণিকভাবে এগুলি ব্যবহারের জন্য পূর্ণসংখ্যার ধরণের প্রত্যয় হওয়া উচিত, বলুন, অ্যারের আরম্ভের অভিব্যক্তি, তবে নেই। floatপ্রত্যয় fএবং ব্যবহার করে double d। অন্যান্য আক্ষরিকের স্পষ্টতই প্রকারভেদ রয়েছে, সেখানে একটি বিশেষ ধরণের রয়েছে null


দিনগুলিতে আপনি কী বোঝাতে চেয়েছিলেন তাতে আমি সত্যিই আগ্রহী। উভয় ক্ষেত্রেই আমি 2147483647 পাই এবং কেন অন্য কিছু আশা করা উচিত তা আমি বুঝতে পারি না।
অবিশ্বাস্য জানুয়ারী

@TheincredibleJan আপনি ন্যায়ত আশা Integer.MAX_VALUEঅবশ্য যদি পার্থক্য মধ্যে কোন উপায় ছিল intএবং longলিটারেল এটা দ্ব্যর্থক হবে। / আমি এই প্রশ্নের কোন স্মরণ নেই, তবে যাইহোক আমার উত্তর স্পষ্ট করে দিয়েছি।
টম হাটিন -
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.