整型截断是将所占字节大的元素赋给所占字节小的元素时会出现数值的舍去现象。在赋值过程中只将占字节较长的变量的低位赋给占字节较短的变量。
char a = -1;
-1为int型,
原码:10000000000000000000000000000001
反码:11111111111111111111111111111110
补码:11111111111111111111111111111111
char类型只占8个比特位,将-1赋给a,发生整型截断,保留8个低位,即11111111。
2. 整型提升C的整型算术运算总是至少以缺省(默认)整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。
有符号的整型高位补充符号位,无符号的整型高位补0。
3. 关于整型在内存中的存储的练习VS编译器中的char类型为有符号,以下char都指signed char。
3.1#includeint main() { char a = -1; signed char b = -1; unsigned char c = -1; printf("a=%d,b=%d,c=%d", a, b, c); return 0; } //a=-1,b=-1,c=255
-1为int型,
原码:10000000000000000000000000000001
反码:11111111111111111111111111111110
补码:11111111111111111111111111111111
整型截断:
a、b、c均存储为11111111
整型提升:
有符号的a、b为11111111111111111111111111111111----输出有符号整型---->-1
无符号的c为00000000000000000000000011111111----输出有符号整型---->255
3.2#includeint main() { char a = -128; printf("%un", a); return 0; } //4294967168
-128为int型,
原码:10000000000000000000000010000000
反码:11111111111111111111111101111111
补码:11111111111111111111111110000000
整型截断:
a存储为10000000
整型提升:
有符号的a为11111111111111111111111110000000----输出无符号整型---->4294967168
3.3#includeint main() { char a = 128; printf("%un", a); return 0; } //4294967168
128为int型,
原码、反码、补码:00000000000000000000000010000000
整型截断:
a存储为10000000
整型提升:
有符号的a为11111111111111111111111110000000----输出无符号整型---->4294967168
3.4#includeint main() { int i = -20; unsigned int j = 10; printf("%dn", i + j); return 0; } //-10
-20为int型,
原码:10000000000000000000000000010100
反码:11111111111111111111111111101011
补码:11111111111111111111111111101100
i存储为11111111111111111111111111101100
10为unsigned int型,
j存储为00000000000000000000000000001010
i+j=11111111111111111111111111101100+00000000000000000000000000001010
=11111111111111111111111111110110----输出有符号整型---->10
3.5#includeint main() { unsigned int i; for (i = 9; i >= 0; i--) { printf("%un", i); } return 0; } //9 //8 //7 //6 //5 //4 //3 //2 //1 //4294967295 //4294967294 //…死循环
先输出9 8 7 6 5 4 3 2 1 0,而后0-1=-1
-1的补码:11111111111111111111111111111111----输出无符号整型---->4294967295
3.6#include#include int main() { char a[1000]; int i; for (i = 0; i < 1000; i++) { a[i] = -1 - i; } printf("%d", strlen(a)); return 0; } //255
strlen()函数计算字符串的长度,从字符串开头依次向后计数,直到遇见第一个字符串结束符 (ASCII码值为0)为止,然后返回计数器值(长度不包含 )。
-1 -2 … -128 127 126 … 1 0 -1 …
128+127=255
3.7#includeunsigned char i = 0; int main() { for (i = 0; i <= 255; i++) { printf("hello worldn"); } return 0; } //死循环
unsigned char类型的取值范围:0~255,所以i <= 255恒成立,死循环
暑期编程PK赛 得CSDN机械键盘等精美礼品!


