আমি একটি এসটিএম 32 এফ 10 এর জন্য সি-তে একটি আবেদন লিখছি, জিসিসি ব্যবহার করে writing
গত (সহজ প্রকল্পের সঙ্গে), আমি সবসময় ভেরিয়েবল সংজ্ঞায়িত করেছেন char
, int
, unsigned int
, ইত্যাদি।
আমি দেখতে এটি যেমন stdint.h সংজ্ঞায়িত ধরনের, ব্যবহার করা খুবই সাধারণ int8_t
, uint8_t
, uint32_t
, ইত্যাদি এটা একাধিক এপিআই এর যে আমি ব্যবহার করছি, এবং এছাড়াও এসটি থেকে এআরএম CMSIS লাইব্রেরিতে সত্য।
আমি বিশ্বাস করি যে আমি বুঝতে পারি কেন আমাদের এমন করা উচিত; সংকলকটিকে মেমরির স্থানটিকে আরও অনুকূলিতকরণের অনুমতি দিতে। আমি আশা করি এর অতিরিক্ত কারণও থাকতে পারে।
যাইহোক, কারণ গ এর পূর্ণসংখ্যা প্রচার নিয়ম, আমি রূপান্তর সতর্কবার্তা বিরুদ্ধে যে কোনো সময় চলমান রাখতে আমি দুটি মানের যোগ করার চেষ্টা করুন, একটি bitwise অপারেশন না, ইত্যাদি সতর্কবার্তা ভালো কিছু লেখা আছে conversion to 'uint16_t' from 'int' may alter its value [-Wconversion]
। বিষয়টি এখানে এবং এখানে আলোচনা করা হয়েছে ।
যখন ভেরিয়েবল হিসেবে ঘোষণা ব্যবহার করে এটি ঘটবে না int
বা unsigned int
।
এই দেওয়া কয়েকটি উদাহরণ দিতে:
uint16_t value16;
uint8_t value8;
আমাকে এটি পরিবর্তন করতে হবে:
value16 <<= 8;
value8 += 2;
এটি:
value16 = (uint16_t)(value16 << 8);
value8 = (uint8_t)(value8 + 2);
এটি কুৎসিত, তবে প্রয়োজনে আমি এটি করতে পারি। আমার প্রশ্নগুলি এখানে:
সেখানে একটি মামলা কোথা থেকে রূপান্তর হয় স্বাক্ষরবিহীন করার স্বাক্ষরিত এবং ফিরে স্বাক্ষরবিহীন ফলাফলের ভুল করবে?
Stdint.h পূর্ণসংখ্যার প্রকার ব্যবহার করার / বিপরীতে অন্য কোনও বড় কারণ আছে কি?
আমি যে উত্তরগুলি পেয়েছি তার উপর ভিত্তি করে, দেখে মনে হচ্ছে stdint.h প্রকারগুলি সাধারণত অগ্রাধিকারপ্রাপ্ত হয়, যদিও সি এবং পিছনে রূপান্তরিত uint
হয় int
। এটি একটি বড় প্রশ্ন বাড়ে:
- আমি টাইপকাস্টিং (উদাহরণস্বরূপ
value16 = (uint16_t)(value16 << 8);
) ব্যবহার করে সংকলক সতর্কতাগুলি প্রতিরোধ করতে পারি । আমি কি শুধু সমস্যাটি লুকিয়ে রাখছি? এটি সম্পর্কে আরও ভাল উপায় আছে?
value8 += 2u;
এবং value8 = value8 + 2u;
, কিন্তু আমি একই সতর্কবার্তা পেতে।
8u
এবং2u
।