(5). 练习:(重点在注释)
1. 区别 unsigned 和 signed :
//练习:1.区别 unsigned 和 signed #include <stdio.h> int main() { char a = -1; //char 在 VS中 默认是 signed char //10000000000000000000000000000001 -- 原码 //11111111111111111111111111111110 -- 反码 //11111111111111111111111111111111 -- 补码 // -1是整数,存进char类型中会发生截断 // 11111111 -- 补码,截断获取最低8位 // 最高位 是 符号位 signed char b = -1; //和 char a 相同 unsigned char c = -1; // 11111111 -- 补码,截断获取最低8位 // 最高位 是 数值位 printf("a=%d,b=%d,c=%d", a, b, c); //%d - 十进制形式打印有符号整型数据, //这里会发生 整型提升 // 11111111 -- 补码,截断获取最低8位 // // 整型提升,有符号位按符号位补满,补满后: //11111111111111111111111111111111 -- 整型提升后补码 //11111111111111111111111111111110 -- 反码 //10000000000000000000000000000001 -- 原码 // // 整型提升,无符号位高位补0,补满后: //00000000000000000000000011111111 -- 整型提升后补码 // 整数原码、反码、补码相同 return 0; }
2. 使用 %u 打印 有符号整型:
(补充:%u -- 十进制形式打印无符号的整型)
(1). 打印 -128:
//练习:2.使用 %u 打印 有符号整型: #include <stdio.h> int main() { char a = -128; //10000000000000000000000010000000 -- 原码 //11111111111111111111111101111111 -- 反码 //11111111111111111111111110000000 -- 补码 // 截断后: // 10000000 -- 截断后补码 printf("%u\n", a); // %u -- 十进制形式打印无符号的整型 // 对 char 变量 打印 整型数字,进行整型提升 // char类型 有符号位,按符号位补满: //11111111111111111111111110000000 -- 补满后的补码 //因为是以 无符号整数 打印,所以 原码、反码、补码 相同 // 那么这个数就很大了 return 0; }
(2). 打印 128:
//练习:3.使用 %u 打印 有符号整型: #include <stdio.h> int main() { // -128 改成 128 char a = 128; //00000000000000000000000010000000 -- 原码 //11111111111111111111111101111111 -- 反码 //11111111111111111111111110000000 -- 补码 // 截断后: // 10000000 -- 截断后补码 // 跟-128是一样的, //只是原码的符号位不一样,但截断后都是10000000 printf("%u\n", a); // %u -- 十进制形式打印无符号的整型 // 对 char 变量 打印 整型数字,进行整型提升 // char类型 有符号位,按符号位补满: //11111111111111111111111110000000 -- 补满后的补码 //因为是以 无符号整数 打印,所以 原码、反码、补码 相同 // 那么这个数就很大了 return 0; }
3. 用%d打印:有符号整型 + 无符号整型
//练习:3. 用%d打印:有符号整型 + 无符号整型 #include <stdio.h> int main() { //有符号整型: int i = -20; //10000000000000000000000000010100 -- 原码 //11111111111111111111111111101011 -- 反码 //11111111111111111111111111101100 -- 补码 //无符号整型: unsigned int j = 10; //00000000000000000000000000001010 -- 原码 // 原码、反码、补码 相同 printf("%d\n", i + j); // i的补码 和 j的补码 相加 //11111111111111111111111111101100 -- i的补码 // + //00000000000000000000000000001010 -- j的补码 // = //11111111111111111111111111110110 -- 两补码相加后的补码 //该补码再通过%d打印有符号数,最高位是符号位,知道补码,要计算得到原码 //11111111111111111111111111110101 -- 反码 // 反码 符号位 不变,其它位 按位取反 //10000000000000000000000000001010 -- 原码 -》 -10 return 0; }
4. 使用无符号整数(无负数)进行自减循环
//使用无符号整数(无负数)进行自减循环 #include <stdio.h> #include <windows.h> int main() { unsigned int i; for (i = 9; i >= 0; i--) { printf("%u\n", i); Sleep(1000); //单位是毫秒,休眠1秒再继续下个语句 } return 0; }
5. 字符数组存储整型数字:
//字符数组存储整型数字: #include <stdio.h> #include <string.h> int main() { char a[1000]; //char类型数组,整型数字只能存储0~-128 int i; for (i = 0; i < 1000; i++) { a[i] = -1 - i;//-1,-2...... } //-1,-2,-3...-128,127,126,...3,2,1,0 -- 存一轮:256个元素 //-1,-2,-3...-128,127,126,...3,2,1,0 -- 存一轮:256个元素 //。。。。。 printf("%d", strlen(a)); //strlen 是求字符串长度的, //统计的是 \0 之前出现的字符的个数 // \0 的ASCII码值是 0,找到0就停止计算 return 0; }
6. unsigned char 取值范围:
//unsigned char 取值范围: #include <stdio.h> unsigned char i = 0;//全局变量 //unsigned char 的整型取值范围是:0~255 int main() { // 255 再 +1 又变成 0 for (i = 0; i <= 255; i++) { printf("hello world\n"); } return 0; }