मैं एक पूरी compilable उदाहरण में अपने कोड बदल दिया है। मैंने एक 'सामान्य' char
की तीसरी सरणी भी जोड़ा जो मेरे पर्यावरण पर हस्ताक्षर किए गए हैं।
#include <cstring>
#include <cstdio>
using std::memcpy;
using std::printf;
int main()
{
unsigned char array[] = {'\xc0', '\x3f', '\x0e', '\x54', '\xe5', '\x20'};
unsigned char array2[6];
char array3[6];
memcpy(array2, array, 6);
memcpy(array3, array, 6);
printf("%x %x %x %x %x %x\n", array[0], array[1], array[2], array[3], array[4], array[5]);
printf("%x %x %x %x %x %x\n", array2[0], array2[1], array2[2], array2[3], array2[4], array2[5]);
printf("%x %x %x %x %x %x\n", array3[0], array3[1], array3[2], array3[3], array3[4], array3[5]);
return 0;
}
मेरे परिणाम थे कि मैं क्या उम्मीद।
c0 3f e 54 e5 20
c0 3f e 54 e5 20
ffffffc0 3f e 54 ffffffe5 20
आप देख सकते हैं, केवल जब सरणी एक हस्ताक्षरित चार प्रकार का है 'अतिरिक्त' ff
संलग्न मिलता है। कारण यह है कि जब memcpy
पर हस्ताक्षर किए char
की सरणी भरता है, अब सेट एक उच्च बिट के साथ मान नकारात्मक char
मूल्यों के अनुरूप है। printf
पर char
को int
प्रकारों पर पदोन्नत किया जाता है जो प्रभावी रूप से एक साइन एक्सटेंशन का अर्थ है।
%x
उन्हें हेक्साडेसिमल में प्रिंट रूप में यद्यपि वे unsigned int
थे, लेकिन के रूप में तर्क int
के रूप में पारित किया गया था व्यवहार तकनीकी रूप से अनिर्धारित रहता है। आम तौर पर दो की पूरक मशीन पर व्यवहार मानक के समान हस्ताक्षरित रूपांतरण के समान होता है जो मॉड 2^एन अंकगणित (जहां एन unsigned int
में मूल्य बिट्स की संख्या है) का उपयोग करता है। चूंकि मान केवल 'थोड़ा' नकारात्मक था (एक संकीर्ण हस्ताक्षरित प्रकार से आ रहा था), पोस्ट रूपांतरण मूल्य अधिकतम संभव unsigned int
मान के करीब है, यानी इसमें हेक्स में 1
(बाइनरी में) या f
अग्रणी हैं।
क्या आप कृपया 'array2' की परिभाषा को दोबारा जांच सकते हैं? –
ऐसा लगता है कि हस्ताक्षरित वर्णों के बजाय साइन इन की तरह सरणी 2 का इलाज किया जा रहा है। –
array2 एक हस्ताक्षरित char है [] – Hock