কেন "ইনট আই = 2147483647 + 1;" ঠিক আছে তবে "বাইট বি = 127 + 1;" সংকলনযোগ্য না?


126

কেন int i = 2147483647 + 1;ঠিক আছে, কিন্তু byte b = 127 + 1;সংকলনযোগ্য নয়?


16
আমারও আসল সন্দেহ আছে: byteডেটা টাইপ করে কেন এমন ব্যথা হয় ?!
BoltClock

9
এটি অবশ্যই একটি নকশার ভুল যা byteস্বাক্ষরবিহীন পরিবর্তে স্বাক্ষরিত।
অপরিবর্তনীয়

4
@ বল্টক্লক এটি কেবলমাত্র ব্যথা যখন আপনি কীভাবে এটি সঠিকভাবে ব্যবহার করতে জানেন না। stackoverflow.com/questions/397867/...
starblue

2
@ স্টারব্লিউ, জাভা বাইট টাইপ প্রযোজ্য এমন কোন বাস্তব জীবনের উদাহরণ আছে কি?
থোরবজর্ন রাভন অ্যান্ডারসন 21

যদি এমন কোনও ডেটা থাকে যা বাইট হিসাবে নির্দিষ্ট করা থাকে তবে byteস্পষ্টতার জন্য জাভা ব্যবহার করুন, যেমন পরামিতিগুলিতে। সেক্ষেত্রে আপনি intমানগুলি নির্ধারণ করতে পারবেন না তা এমনকি কিছু বাগগুলি ধরতে পারে। অথবা byteঅ্যারেতে স্থান বাঁচাতে ব্যবহার করুন । আমি এমন byteএকক মানের জন্য ব্যবহার করব না যা কেবল বাইটে ফিট হয়।
স্টার ব্লু

উত্তর:


172

ধ্রুবক, আপনি ints যেমন মূল্যায়ন করা হয়, যাতে 2147483647 + 1উপচে এবং আপনি একটি নতুন কোন int, যা হস্তান্তরযোগ্য দেয় int, যখন 127 + 1নামেও মূল্যায়ন intকরার সমান 128, এবং এটা হস্তান্তরযোগ্য নয় byte


10
প্রকৃতপক্ষে, আজ আমি জাভা পাজলারের কয়েকটি পড়লাম , যার মধ্যে একটি ধাঁধা রয়েছে ... এখানে দেখুন: javapuzzlers.com/java-puzzlers-sampler.pdf - ধাঁধা 3
এমবিআইডি

3
intবাইনারি সংখ্যার প্রচারের কারণে ইস্যুটি প্রকার , মানটি 127একটি লাল শিরোনাম।
স্টার ব্লু

আমি অসীম নির্ভুলতার সাথে মূল্যায়ন করা এবং ইন্ট আই = 2147483647 + 1 এ ত্রুটি দেওয়া পছন্দ করব;
এডুয়ার্ডো

@ এমবিওয়াইডি: আপনি যেমন বলেছিলেন " while 127 + 1 also evaluated as int equals to 128, and it is not assignable to byte.", এর অর্থ কি এই যে 50 + 1 হিসাবে মূল্যায়ন করা হবে byteএবং তাই এগুলি নিযুক্তযোগ্য byte?
ভূষণ

1
@ 10101010 - ঠিক না। এটি বাইট হিসাবে নির্ধারিত হবে, তবে প্রথমে (মান অনুসারে) এটি int হিসাবে মূল্যায়ন করা হবে।
এমবিআইডি

35

আক্ষরিক 127 টাইপ প্রকারের মান বোঝায়। আক্ষরিক ১. এই দুটিটির যোগফলটি পূর্ণসংখ্যা 128 হয় the এক্সপ্রেশনগুলির আসল মানটির সাথে এর কোনও যোগসূত্র নেই। এটি জাভা জোর সমর্থন করে না (*)। আপনাকে একটি টাইপকাস্ট যুক্ত করতে হবে

byte b = (byte)(127 + 1);

এবং তারপরে এটি সংকলন করে।

(*) কমপক্ষে স্ট্রিং-থেকে-পূর্ণসংখ্যক, ভাসমান-থেকে-টাইমের মতো নয়, ... জাভা যদি এক অর্থে ক্ষয়-ক্ষতি না করে তবে তাদের জোর সমর্থন করা হয় (জাভা এটিকে "প্রশস্তকরণ" বলে ডাকে)।

এবং না, "জবরদস্তি" শব্দটির সংশোধন করার প্রয়োজন ছিল না। এটি খুব ইচ্ছাকৃতভাবে এবং সঠিকভাবে এটি নির্বাচিত হয়েছিল। হাতের নিকটতম উত্স থেকে (উইকিপিডিয়া): "বেশিরভাগ ভাষায়, জবরদস্তি শব্দটি সংকলনের সময় বা রান সময়কালে একটি অন্তর্নিহিত রূপান্তর বোঝাতে ব্যবহৃত হয়।" এবং "কম্পিউটার বিজ্ঞান, টাইপ রূপান্তর, টাইপকাস্টিং এবং বলপ্রয়োগ হয় বিভিন্ন পথ, পরোক্ষভাবে বা স্পষ্টভাবে, অন্য একটি ডেটা প্রকার একজন সত্তা পরিবর্তন।"।


আপনার কোড উদাহরণটি সম্ভবত বাইট বি = (বাইট) 127 + 1 হওয়া উচিত; যা 'একটি সর্বোচ্চ আউট বাইট মান 1 যোগ করুন', আপনার উদাহরণ কেবল 128 এর মান মান একটি বাইট মান মধ্যে রূপান্তরিত করে।
এনকেসিএসএস

6
@ এন কে সি এস এস - আমি মনে করি না আপনি ঠিক বলেছেন, এটি - (byte)(127 + 1)128 (পূর্ণসংখ্যা) একটি বাইটে ফেলেছে , যখন (byte)127 + 1এটি 127 কে বাইটে ফেলেছে, তবে এটি আবার একটি ইনট্রে যুক্ত করা হয়েছে, যেহেতু এটি 1 (ইনট) যোগ করা হয়েছে এবং আপনি 128 (ইনট) পান এবং ত্রুটি স্থির থাকে।
এমবিআইডি

6

@ এমবিওয়াইডি-র প্রমাণ হিসাবে:

নিম্নলিখিত কোড সংকলন:

byte c = (byte)(127 + 1);

কারণ অভিব্যক্তিটি (127 + 1)ইনট এবং স্কোপ অফ byteটাইপের বাইরে থাকলেও ফলাফলটি কাস্ট করা হয় byte। এই অভিব্যক্তি উত্পাদন করে -128


3

জেএলএস 3 # 5.2 অ্যাসাইনমেন্ট রূপান্তর

(পরিবর্তনশীল = প্রকাশ)

তদতিরিক্ত, যদি অভিব্যক্তিটি বাইট, সংক্ষিপ্ত, চর বা আন্তঃ টাইপের ধ্রুবক প্রকাশ (§15.28) হয়:

ভেরিয়েবলের ধরণটি বাইট, সংক্ষিপ্ত বা চর এবং ধ্রুবক অভিব্যক্তির মান ভেরিয়েবলের ধরণের ক্ষেত্রে উপস্থাপনযোগ্য হলে একটি সংকীর্ণ আদিম রূপান্তর ব্যবহৃত হতে পারে।


এই ধারাটি না থাকলে আমরা লিখতে পারব না

byte x = 0;
char c = 0;

কিন্তু আমরা কি এটি করতে সক্ষম হব? আমি তাই মনে করি না. আদিমদের মধ্যে রূপান্তরকরণে বেশ কিছু জাদু চলছে, একটি অবশ্যই খুব সতর্কতা অবলম্বন করা উচিত। আমি আমার লেখার বাইরে চলে যেতাম

byte x = (byte)0;

প্রশ্নটি হিসাবে আমাদের সক্ষম হওয়া উচিত ... আমি আসলে কিছু ভুল দেখছি না byte x = 0তবে আবার, আমি একজন সি প্রোগ্রামার।
গ্রেডি প্লেয়ার 3

আমি হয়ত চর সি = 0 এর বিপরীতে একটি যুক্তি দেখতে পেলাম তবে বাইট x = 0 ভুল কেন?
মাইকেল বার্গে

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

সংকীর্ণ আদিম রূপান্তরটি দীর্ঘ থেকে আন্ত, যেমন int i = 1 + 0L এর ক্ষেত্রে হয় কি একইরকম নিয়ম প্রয়োগ হয়? কেবল জিজ্ঞাসা করা হচ্ছে কারণ আপনার উদ্ধৃত পাঠ্যটি স্পষ্টভাবে সেই কেসটি ছেড়ে দিয়েছে।
এরউইন স্মাউট

@ ইরুইন নং, int i=0Lঅবৈধ।
অপরিবর্তনীয়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.