আমি কীভাবে সি ++ এ সংক্ষিপ্ত আক্ষরিক লিখব?


120

খুব বেসিক প্রশ্ন: আমি shortসি ++ তে আক্ষরিক কীভাবে লিখব ?

আমি নিম্নলিখিত জানি:

  • 2 একটি int
  • 2U একটি unsigned int
  • 2L ইহা একটি long
  • 2LL ইহা একটি long long
  • 2.0f ইহা একটি float
  • 2.0 ইহা একটি double
  • '\2'একটি char

তবে আমি কীভাবে shortআক্ষরিক লিখব ? আমি চেষ্টা করেছি 2Sকিন্তু এটি একটি সংকলক সতর্কতা দেয়।


10
আমি অনুমান করি যে সংক্ষিপ্ত আক্ষরিক সম্পূর্ণরূপে সমর্থন করা যায় না কারণ মূল্যায়নকালে int এর চেয়ে কম কিছু "ইনটকে" প্রচারিত হবে। int সবচেয়ে প্রাকৃতিক আকার আছে। একে সি ++ তে পূর্ণসংখ্যা প্রচার বলা হয়।
ব্যবহারকারী534498

উত্তর:


82
((short)2)

হ্যাঁ, এটি কঠোরভাবে একটি সংক্ষিপ্ত আক্ষরিক নয়, আরও অনেকটা কাস্টড-ইনট, তবে আচরণ একই রকম এবং আমার মনে হয় এটি করার সরাসরি কোনও উপায় নেই।

আমি এটি করছি কারণ আমি এটি সম্পর্কে কিছুই খুঁজে পাইনি। আমি অনুমান করব যে সংকলকটি এটি সংক্ষিপ্ত করার জন্য যথেষ্ট স্মার্ট হবে যেন এটি একটি সংক্ষিপ্ত আক্ষরিক (যেমন এটি আসলে কোনও ইনট বরাদ্দ করে না এবং তারপরে প্রতিবার এটি কাস্ট করে না)।

নিম্নলিখিত সম্পর্কে আপনার কতটা চিন্তা করা উচিত তা নীচের চিত্রিত করে:

a = 2L;
b = 2.0;
c = (short)2;
d = '\2';

সংকলন -> বিচ্ছিন্ন ->

movl    $2, _a
movl    $2, _b
movl    $2, _c
movl    $2, _d

আমি এটি করছি কারণ আমি এটি সম্পর্কে কিছুই খুঁজে পাইনি। আমি অনুমান করব যে সংকলকটি এটি সংক্ষিপ্ত করার জন্য যথেষ্ট স্মার্ট হবে যেন এটি একটি সংক্ষিপ্ত আক্ষরিক (যেমন এটি আসলে কোনও ইনট বরাদ্দ করে না এবং তারপরে প্রতিবার এটি কাস্ট করে না)।
কিপ করুন

"Castালাই" আসলে কিছুই করছে না। যখন আমরা সি বা সি ++ (। নেট এমএসআইএল যদিও একটি আলাদা গল্প) বলছি তখন কোনও "কাস্ট" এসেম্বলারের নির্দেশ নেই।
ধাতুতে

9
উপরে ক, বি, সি এবং ডি প্রকারের কি কি?
এটস গোলাল

2
@ এটস গোড়াল: সমস্ত ইনটস। সংক্ষিপ্ত বা চরকে পরিবর্তন করা সম্ভবত বোর্ড জুড়ে নির্দেশকে মুভ বা মুবগুলিতে পরিবর্তিত করবে।

2
এটি কোনও সংক্ষিপ্ত আক্ষরিক নয়। আপনি যখন castালাইটি ব্যবহার করেন এবং জিসিসি এবং বিকল্প -WWW রূপান্তরটি সংকলন করেন আপনি এখনও বিবৃতিটির জন্য একটি সংকলক ডায়াগনস্টিক পান short foo = 1; foo += (short)2;। তবে পূর্ণসংখ্যার প্রচারের কারণে এটি সংঘবদ্ধ হতে পারে না।
হার্পার

51

সি ++ 11 আপনাকে যা চায় তার খুব কাছাকাছি দেয়। (আরও জানতে "ব্যবহারকারী-সংজ্ঞায়িত আক্ষরিক" অনুসন্ধান করুন))

#include <cstdint>

inline std::uint16_t operator "" _u(unsigned long long value)
{
    return static_cast<std::uint16_t>(value);
}

void func(std::uint32_t value); // 1
void func(std::uint16_t value); // 2

func(0x1234U); // calls 1
func(0x1234_u); // calls 2

// also
inline std::int16_t operator "" _s(unsigned long long value)
{
    return static_cast<std::int16_t>(value);
}

6
shortশারীরিকভাবে কোনও std::uintজিনিস হতে পারে না , কারণ এটি একটি স্বাক্ষরিত ধরণের। এবং এটির জন্য 16 বিট বা একই ধরণের কোনও std::int16_tপ্রয়োজন হয় না ... যা প্ল্যাটফর্মটি সঠিক-প্রস্থের প্রকারটি সরবরাহ করতে না পারলে কোনও প্রদত্ত বাস্তবায়নে নিজেই উপস্থিত থাকার প্রয়োজন হয় না। এই উত্তরের মূল ধারণাটি ভাল, তবে এটি অনাবন্ধনীয় স্পর্শক দ্বারা অবাস্তব প্রকারের সাথে অবহিত করা হয়েছে যা ওপি সম্পর্কে জিজ্ঞাসা করেনি।
আন্ডারস্কোর_১

নোট ব্যবহারকারী-সংজ্ঞায়িত লিটারেল VS2015 পর্যন্ত ভিসুয়াল স্টুডিও সমর্থিত নয়: msdn.microsoft.com/en-us/library/hh567368(v=vs.140).aspx
parsley72

আমি এটি পছন্দ করি বা ঘৃণা করি তা আমি জানি না তবে সি ++ এ আমার সত্যিকারের স্ট্রং ইন্টিজার টাইপ সিস্টেমে এটিই শেষ টুকরা যা আমি কাজ করছি, এটি আশ্চর্যজনক।
সাহসাহে

@undcore_d প্রতিধ্বনিত হয়ে আমি ওপরে তুলতে পারব তবে একটি সম্পাদনার পরে shortওপি কর্তৃক অনুমোদিত।
v.oddou

28

এমনকি সি 99 স্ট্যান্ডার্ডের লেখকরা এটির দ্বারা ধরা পড়ে। এটি ড্যানি স্মিথের পাবলিক ডোমেন stdint.hপ্রয়োগের একটি স্নিপেট :

/* 7.18.4.1  Macros for minimum-width integer constants

    Accoding to Douglas Gwyn <gwyn@arl.mil>:
    "This spec was changed in ISO/IEC 9899:1999 TC1; in ISO/IEC
    9899:1999 as initially published, the expansion was required
    to be an integer constant of precisely matching type, which
    is impossible to accomplish for the shorter types on most
    platforms, because C99 provides no standard way to designate
    an integer constant with width less than that of type int.
    TC1 changed this to require just an integer constant
    *expression* with *promoted* type."
*/

18

আপনি যদি মাইক্রোসফ্ট ভিজ্যুয়াল সি ++ ব্যবহার করেন তবে প্রতিটি পূর্ণসংখ্যার ধরণের জন্য আক্ষরিক প্রত্যয়গুলি পাওয়া যায়:

auto var1 = 10i8;  // char
auto var2 = 10ui8; // unsigned char

auto var3 = 10i16;  // short
auto var4 = 10ui16; // unsigned short

auto var5 = 10i32;  // int
auto var6 = 10ui32; // unsigned int

auto var7 = 10i64;  // long long
auto var8 = 10ui64; // unsigned long long

মনে রাখবেন যে এগুলি একটি মানহীন এক্সটেনশন এবং পোর্টেবল নয় । আসলে, আমি এমএসডিএন-এ এই প্রত্যয়গুলির কোনও তথ্যও সনাক্ত করতে পারি না।


1
আপনি যখন প্রত্যয় এক ট্রেস, আপনি যে যেমন দেখতে পাবেন ""ui8হিসাবে সংজ্ঞায়িত করা হয় '\000', যা মূলত '\0'
নিকিতা

10

আপনি সিউডো কনস্ট্রাক্টর সিনট্যাক্সও ব্যবহার করতে পারেন।

short(2)

আমি এটি কাস্টিংয়ের চেয়ে বেশি পঠনযোগ্য বলে মনে করি।


4
একে "ফাংশনাল কাস্ট এক্সপ্রেশন" বলা হয়। আমি এটিকেও খুব পছন্দ করি বিশেষত উইন্ডোজ এপিআই সহ প্রোগ্রামিংয়ের সময়।
ক্লাউস ট্রেন্ডল

6

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

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