ইউনিক্স একটি স্বাক্ষরিত পূর্ণসংখ্যায় টাইমস্ট্যাম্পগুলি কেন সঞ্চয় করে?


24

একটি স্বাক্ষরিত পূর্ণসংখ্যা কেন টাইমস্ট্যাম্পগুলির প্রতিনিধিত্ব করতে ব্যবহৃত হয়? ১৯ 1970০ সালে একটি স্পষ্টভাবে সংজ্ঞায়িত শুরু রয়েছে যা 0 হিসাবে উপস্থাপিত হয়, তবে কেন তার আগে আমাদের সংখ্যার প্রয়োজন হবে? নেতিবাচক টাইমস্ট্যাম্পগুলি কোথাও ব্যবহৃত হয়?


2
এজন্য নস্ট্রাডামাস 3000+ বছর ধরে তার ভবিষ্যদ্বাণী লিখতে কম্পিউটারটি ব্যবহার করতে পারেন নি ... এটি একটি উপচে পড়বে এবং তার তারিখগুলি নেতিবাচক হিসাবে দেখায়। আমি মনে করি তারা এটিকে Y3K বাগ বা কিছু বলেছে!
পৌঁছান

3
প্রাচীন রোমানদের একটি আরও খারাপ সমস্যা হয়েছিল যখন বছরের সংখ্যাগুলি নেতিবাচক থেকে ধনাত্মক হয়ে যায়। যদি তাদের কাছে শূন্য সংখ্যাটি প্রকাশ করার উপায় থাকে তবে তারা এটিকে ওয়াই0 কে সমস্যা বলত। 8-)}
কেইথ থমসন

উত্তর:


35

সি এর প্রাথমিক সংস্করণগুলির স্বাক্ষরবিহীন পূর্ণসংখ্যা ছিল না। (কিছু প্রোগ্রামার পয়েন্টার ব্যবহার করেন যখন তাদের স্বাক্ষরবিহীন পাটিগণিতের প্রয়োজন হয়।) আমি জানি না কোনটি প্রথমে এসেছিল, time()ফাংশন বা স্বাক্ষরবিহীন প্রকারগুলি, তবে আমি সন্দেহ করি যে স্বাক্ষরযুক্ত প্রকারগুলি সর্বজনীনভাবে উপলব্ধ হওয়ার আগেই প্রতিনিধিত্বটি প্রতিষ্ঠিত হয়েছিল। এবং 2038 ভবিষ্যতে যথেষ্ট ছিল যে এটি সম্ভবত চিন্তা করার মতো ছিল না n't আমি সন্দেহ করি যে অনেক লোক ভেবেছিল যে ততক্ষণে ইউনিক্স উপস্থিত থাকবে।

স্বাক্ষরযুক্ত আরেকটি সুবিধা time_tহ'ল এটিকে b৪ বিটের মধ্যে প্রসারিত করা (যা ইতিমধ্যে কিছু সিস্টেমে ঘটছে) আপনাকে 1970 এর আগে বারের প্রতিনিধিত্ব করার ক্ষমতা হারিয়ে না ফেলে ভবিষ্যতে কয়েকশো বিলিয়ন বছর কয়েকবার উপস্থাপন করতে দেয় ((এই কারণেই আমি কোনওটিতে স্যুইচ করার বিরোধিতা করি 32-বিট স্বাক্ষরবিহীন time_t ; আমাদের কাছে 64 বিটে স্থানান্তর করার পর্যাপ্ত সময় রয়েছে have)


7
timeফাংশন যুগান্তকারী চেয়ে পুরোনো হল: ইউনিক্স v1 এ (1971 সালে) 1971/01/01 উপর, এক সেকেন্ডের 1 / 60th একক গণনা মধ্যরাত্রি থেকে। এটি ইতিমধ্যে একটি পরিচিত বাগ ছিল যে "কালানুক্রমিক - মনের ব্যবহারকারী উল্লেখ করবেন যে 2 ** 32 সেকেন্ডের সিক্সটিথ কেবল প্রায় 2.5 বছর।" ১৯ &৮unsigned সালে কে অ্যান্ডআর দ্বারা প্রবর্তিত হয়েছিল , ১৯ e০ এর যুগ প্রতিষ্ঠিত হওয়ার পরেও।
গিলস 'তাই মন্দ হওয়া বন্ধ করুন'

আমি একটি দ্রুত পরীক্ষা করেছি এবং আমার -৪-বিট লিনাক্স বাক্সে। gmtimeএবং localtime2147483647 বছরে সর্বাধিক আউট (বছর হিসাবে -2147483648 দেওয়ার পরের দ্বিতীয় সহ)। সুতরাং অতীতে 55 বিট সময়ের জন্য কাউকে স্বাক্ষরযুক্ত 32-বিট ইন্টির পরিবর্তে বছরের জন্য একটি 64-বিট ইনট ব্যবহার করতে আউটপুট রুটিন আপডেট করতে হবে। আশা করা যায় যে কেউ কেউ কয়েক কোটি বছর পরে এই বাগটি যত্ন নেবে care
ফ্রেইহিট

@ ফ্রেইহাইট: আকর্ষণীয়। সেখানে সমস্যাটি হ'ল এই struct tmধরণের একটি সদস্য রয়েছে tm_year(1900 সাল থেকে বছরের উপস্থাপিত) যা টাইপ int। 64-বিট সিস্টেমে সহজেই একটি 64-বিট থাকতে পারে time_tতবে তাদের সাধারণত 32-বিট থাকে int। (যদি char8 বিট হয় এবং int64 বিট হয়, তবে shortতা 16 বা 32 বিট হতে পারে, এবং অন্য আকারের জন্য কোনও পূর্বনির্ধারিত টাইপ থাকবে না)) তবে time()সম্ভবত এটিই কেবলমাত্র ফাংশনটির <time.h>জন্য সিস্টেম-স্তর সমর্থন প্রয়োজন; time_tমানগুলি পাঠযোগ্য স্ট্রিংয়ে রূপান্তর করতে আপনি নিজের কোডটি লিখতে পারেন ।
কিথ থম্পসন

12

এটি টাইমস্ট্যাম্পগুলি সমর্থন করে এবং 1970 সালের 1 জানুয়ারীর তারিখের আগে।


1
এটি অতীতে শুধুমাত্র 68 বছর করে - 1902. এটি বেশ অল্প মনে হয়।
বকুদান

2
পসিক্সের time_tজন্য কেবল 32 বিট লাগবে না; এটি ইতিমধ্যে অনেক সিস্টেমে b৪ বিট।
কিথ থম্পসন

1
mktime()ফাংশন -1ত্রুটির ক্ষেত্রে ফিরে আসে তাই 1970-01-01 এর আগে সঠিক টাইমস্ট্যাম্পগুলির মধ্যে ত্রুটি টিএসের মধ্যে পার্থক্য করা অসম্ভব। 1970-01-01 এর আগে পোশাকের তারিখগুলি নিষিদ্ধ
DimG

@ ডিমগ: একটি ত্রুটি এবং নির্দিষ্ট টাইমস্ট্যাম্পের মধ্যে পার্থক্য করা কঠিন 1969-12-31 23:59:59 UTC-1বাদে অন্য একটি নেতিবাচক মান দ্ব্যর্থহীন।
কিথ থম্পসন

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