জাভাতে আপনি কীভাবে বাইট আক্ষরিক উল্লেখ করবেন?


238

আমার যদি কোন পদ্ধতি থাকে

void f(byte b);

castালাই না করে আমি কীভাবে এটি একটি সংখ্যাসূচক যুক্তি দিয়ে বলতে পারি?

f(0);

একটি ত্রুটি দেয়।


1
@ ওলিহোলজ অতিরিক্ত পার্সিং ওভারহেডের সাথে হ্রাস
পাচ্ছে

উত্তর:


284

তুমি পার না. একটি মৌলিক সংখ্যাসূচক ধ্রুবকটিকে একটি পূর্ণসংখ্যা হিসাবে বিবেচনা করা হয় (বা এটি "L" এর পরে দীর্ঘ হয়), সুতরাং এটি অবশ্যই প্যারামিটার হিসাবে পাস করার জন্য আপনাকে অবশ্যই এটি স্পষ্ট করে বাইটে নামিয়ে ফেলতে হবে। আমি যতদূর জানি কোনও শর্টকাট নেই।


11
আপনি যদি এই ধরণের অনেক কাজ করে থাকেন তবে আপনি byte b(int i) { return (byte) i; }কোথাও একটি সাধারণ সহায়ক পদ্ধতি সংজ্ঞায়িত করতে পারেন এবং স্থিরভাবে এটি আমদানি করতে পারেন। তারপরে আপনি f (b (10)) লিখতে পারেন।
ইওনা অ্যাপলেট্রি

125

তোমাকে ফেলে দিতে হবে, আমি ভয় পাচ্ছি:

f((byte)0);

আমি বিশ্বাস করি যে মৃত্যুদন্ড কার্যকর হওয়ার পরিবর্তে সংকলন- সময়ে উপযুক্ত রূপান্তর সম্পাদন করবে , সুতরাং এটি কার্য সম্পাদনের দন্ড ঘটাচ্ছে না। এটি কেবল অসুবিধাজনক :(


11
সংকলন-সময় রূপান্তরকরণের জন্য +1। আপনারা যদি উভয়ই সংকলকগুলি বুঝতে পারেন এবং ভাষা ডিজাইনারগুলিতে বিশ্বাস রাখেন (যা আমাদের উচিত), তবে অন্যথায় এতটা স্পষ্ট না হয় common
ফিলিপ গিন

31

আপনি জাভাতে একটি বাইট আক্ষরিক ব্যবহার করতে পারেন ... সাজানো।

    byte f = 0;
    f = 0xa;

0xa(int আক্ষরিক) স্বয়ংক্রিয়ভাবে বাইটে কাস্ট হয়ে যায়। এটি আসল বাইট আক্ষরিক নয় (নীচে জেএলএস এবং মন্তব্যগুলি দেখুন), তবে এটি যদি হাঁসের মতো ঝাঁকুনি দেয় তবে আমি এটিকে হাঁস বলি।

আপনি যা করতে পারবেন না তা হ'ল:

void foo(byte a) {
   ...
}

 foo( 0xa ); // will not compile

আপনাকে নিম্নলিখিত হিসাবে কাস্ট করতে হবে:

 foo( (byte) 0xa ); 

তবে মনে রাখবেন যে এগুলি সমস্ত সংকলন করবে এবং তারা "বাইট আক্ষরিক" ব্যবহার করছে:

void foo(byte a) {
   ...
}

    byte f = 0;

    foo( f = 0xa ); //compiles

    foo( f = 'a' ); //compiles

    foo( f = 1 );  //compiles

অবশ্যই এটিও সংকলন করে

    foo( (byte) 1 );  //compiles

17
এগুলি বাইট আক্ষরিক নয়। এগুলি বিভিন্ন ধরণের (প্রকৃতপক্ষে) বেশিরভাগ ক্ষেত্রে আক্ষরিক, যা স্পষ্টভাবে বাইটে রূপান্তরিত হচ্ছে। উদাহরণস্বরূপ, 1একটি অভ্যন্তরীণ আক্ষরিক, কিন্তু double d = 1;ঠিক জরিমানা সংকলন।
স্মিথ মুড

আপনি যদি ইতিমধ্যে কৌশল ব্যবহার করেন। এর স্থিতিশীল আমদানি করুন byte b(int i){}, তারপরে b(1)লম্বা এবং কম কৌশলযুক্ত f=1
এলাজার লেইবোভিচ

1
@ সিমহমুদ, তবে যেহেতু রূপান্তরটি প্রাক-সংকলক / সংকলক (প্রোগ্রামটি এমনকি চলমান শুরু হওয়ার আগে) দ্বারা চালিত হয়েছিল এবং রানটাইম নয়, তবে এটি আক্ষরিক নয় কি?
পেসারিয়ার

2
@ পেসারিয়ার এটি একটি আক্ষরিক। এটি কোনও "বাইট আক্ষরিক" নয়। এটি একটি int। সংকলক এটিকে একটি আক্ষরিক (যেমনটি হওয়া উচিত) হিসাবে বিবেচনা করে এবং কার্যনির্বাহে একটি অন্তর্নিহিত ডাউনকাস্ট করে (যেমনটি এটি করা উচিত )ও করে। কোনও পর্যায়ে এটি "বাইট আক্ষরিক" (যা বিদ্যমান নেই) হিসাবে পার্স করা হয় না। সংকীর্ণ রূপান্তর সম্পর্কিত জেএলএস বিভাগ 5.2 দেখুন বিশেষত উত্তরার্ধে । কেবলমাত্র জড়িত জিনিসগুলি হ'ল একটি পূর্ণসংখ্যা ধ্রুবক এবং বাইট ভেরিয়েবলের জন্য উপযুক্ত অ্যাসাইনমেন্ট রূপান্তর নিয়মের প্রয়োগ।
জেসন সি

আমি এই উত্তরটি +1 দিয়েছি কারণ কৌশলটি উপন্যাস, তবে প্রকৃতপক্ষে জাভাতে কোনও "বাইট আক্ষরিক" নেই।

12

আপনি যদি কোডগুলিতে আক্ষরিক উত্তীর্ণ হয়ে থাকেন তবে সময়ের আগে কেবল এটি ঘোষণা করা থেকে আপনাকে কী থামছে?

byte b = 0; //Set to desired value.
f(b);

1
এটি আপনাকে মানটিকে আরও অর্থপূর্ণ নাম দেওয়ার অনুমতি দেয়। en.wikedia.org/wiki/…
অ্যারন জে ল্যাং

এটি দরকারী। আপনি যদি জাভা'র 'ফিল' পদ্ধতিটি ব্যবহার করে কোনও বাইটের অ্যারে পূরণ করার চেষ্টা করছেন, এটি সবচেয়ে বুদ্ধিমান।

সংকলকটি কেবল নিম্নলিখিত সম্পর্কে অভিযোগ করেছে, এবং আমার কাস্ট যোগ করার প্রয়োজন ছিল: public static final byte BYTE_MASK = ( byte )0xff;
মারভো

এবং আমি বুঝতে পেরেছিলাম যে আমি আসলে চেয়েছি byte BYTE_MASK = 0x000000ff;যাতে আমি কিছু কদর্য সাইন এক্সটেনশন বাগগুলি পাই।
মারভো

5

পদ্ধতিটি ওভাররাইডিং সম্পর্কে কী

void f(int value)
{
  f((byte)value);
}

এই জন্য অনুমতি দেবে f(0)


26
-1 কোড পাঠযোগ্যতার জন্য এটি অত্যন্ত খারাপ। এবং সমস্যাগুলি দেখা দিতে পারে যখন লোকেরা আসলে বাইটটি ধরে রাখতে পারে তার চেয়েও বেশি একটি মান পাস করার চেষ্টা করে। আমি এই পদ্ধতিটি ব্যবহার করা থেকে মানুষকে নিরুৎসাহিত করি!
রল্ফ ツ

3
এছাড়াও, এই কাস্টটি রান-টাইমে ঘটবে। খুব খারাপ.
BrainSlugs83

রল্ফের (সসু) সাথে সম্পূর্ণরূপে একমত, এটি সম্ভবত যুক্তিযুক্ত, প্রযুক্তিগতভাবে এটি ওভারলোডিং নয়, ওভাররাইডিং নয়।
ক্রোম্যাক্স

-2

জাভা 7 এবং পরবর্তী সংস্করণ সহ, আপনি এইভাবে একটি বাইট আক্ষরিক নির্দিষ্ট করতে পারেন: byte aByte = (byte)0b00100001;

তথ্যসূত্র: http://docs.oracle.com/javase/8/docs/technotes/guides/language/binary-literals.html


20
বাইনারি আক্ষরিক! = বাইট আক্ষরিক
মার্সেলো নুসিও

আপনি এখনও বাইট কাস্টিং নিচে।
এমকাজেম আখগারি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.