#define _CRT_SECURE_NO_WARNINGS 1 //int main() //{ // int a = -10; // int b = 10; // // a 00000000000000000000000000001010(-10原码) // // 11111111111111111111111111110101(-10反码) // //在内存中存储为11111111111111111111111111110110(-10补码) // //十六进制形式为FFFFFF6-----实际为6FFFFFFF(四个字节) // //b 00000000000000000000000000001010(10原码) // // 11111111111111111111111111110101(10反码) // //在内存中存储为11111111111111111111111111110110(10补码) // //十六进制形式为000000a-----实际为a0000000(四个字节) // return 0; //} //大端字节序:把数据的低位字节序的内容存放在高地址处,高位字节序的内容存放在低地址处 //如int a=0x11223344(11为高地址,44为低地址) 地址由低到高为11223344(大端正着存) //小端字节序:把数据的高位字节序的内容存放在高地址处,低位字节序的内容存放在低地址处 //如int a=0x11223344(11为高地址,44为低地址) 地址由低到高为44332211(小端正着存) //在计算机中,以字节为单位,每个地址单元都对应一个字节(8bit),除了8bit的char,还有16bit的short 32bit的long //请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序(出自百度2015年系统工程师笔试题) #include<stdio.h> //int main() //{ // int a = 1; // char* p = (char*) & a;//将a的二进制地址传给p,*p解引用,&a是int型,需要强制类型转换成char型 // if (*p == 1) // { // printf("小端\n"); // } // else // { // printf("大端\n"); // } // return 0; //} //自定义函数,并用函数实现 //int check_sys() //{ // int a = 1; // char* p = (char*)&a;//将a的地址传给p并解引用,并用char类型检查第一个字节的值,需要强制转换a为p // //if (*p == 1) // //{ // // return 1; // //} // //else // //{ // // return 0; // //} // return*p;//返回1表示小端,返回0表示大端 //} //int main() //{ // int a = 1; // int ret = check_sys(); // if (ret == 1) // { // printf("小端\n"); // } // else // { // printf("大端\n"); // } // return 0; //} //输出结果是? //#include<stdio.h> //int main() //{ // char a = -1; // signed char b = -1; // unsigned char c = -1; // printf("a=%d\nb=%d\nc=%d\n", a, b, c); // //打印结果为-1 -1 255 // //a中 // //-1的原码为10000000000000000000000000000000001 // //-1的反码为11111111111111111111111111111111110 // //-1的补码为11111111111111111111111111111111111 // //char型只能存一个字节(8个bit),11111111(高位是符号位) // // 整型提升(有符号位)提升补1 // // 11111111111111111111111111111111111(-1) // //b中 // //-1char型为11111111(高位是符号位)整型提升(有符号位)提升补1 // // 11111111111111111111111111111111111(-1) // //c中 // //-1char型是11111111(高位表示符号位) // //无符号位整型提升补0 // //变为 00000000000000000000000000001111111(为255,补码)(正数的原码反码补码相同,所以也是原码) // return 0; //} #include<stdio.h> //int main() //{ // char a = -128; // //10000000000000000000000010000000(原码) // //11111111111111111111111101111111(反码) // //11111111111111111111111110000000(补码) // //char型,只能存1字节,8bit,即10000000(-128)(有符号char型,高位补1),补后为11111111111111111111111110000000 // //%u是无符号整形,此时的第一位的1表示符号位,是正数,所以原码和补码相同 // printf("%u\n", a); // return 0; //} //int main() //{ // char a = 128; // printf("%u\n", a);// // //00000000000000000000000010000000(128原码,原反补相同) // //10000000(char型取前七位),而char型为有符号型,第一位为1,为负,整型提升时,补1 // //11111111111111111111111100000000 // // // return 0; //} //char(有符号)在内存中类型的范围(0~127~~~~~-1~-128) //00000000(正数)~~~~~~01111111~~~~10000000~10000001~~~~11111111(负数)的补码是(取反加一或先减一后取反两种方法) // (定义:10000000的补码是-128)-128~~-127(11111111)~(-1)100000001 //0~127~~~~~~~~ int main() { int i = -20; //1000000000000000000000010100(-10的原码) //1111111111111111111111101011(反码) //1111111111111111111111101100(补码)(计算机存的是补码) unsigned int j = 10; //0000000000000000000000001010(正整数的原码反码补码相同)(计算机存的是补码) printf("%d\n", i + j);//打印结果为-10 //1111111111111111111111101100 //0000000000000000000000001010 //1111111111111111111111110110--补码(%d打印的是有符号整形的原码)------(无符号整形是遵循原数最高位为1时,全部补1,为0时全补0) //1111111111111111111111110101--反码 //1000000000000000000000001010--原码 (-10) return 0; }