栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C语言】整型截断和整型提升

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C语言】整型截断和整型提升

1. 整型截断

整型截断是将所占字节大的元素赋给所占字节小的元素时会出现数值的舍去现象。在赋值过程中只将占字节较长的变量的低位赋给占字节较短的变量。

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
#include 

int 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
#include 

int main()
{
	char a = -128;
	printf("%un", a);

	return 0;
}
//4294967168

-128为int型,

原码:10000000000000000000000010000000

反码:11111111111111111111111101111111

补码:11111111111111111111111110000000

整型截断:

a存储为10000000

整型提升:

有符号的a为11111111111111111111111110000000----输出无符号整型---->4294967168

3.3
#include 

int main()
{
	char a = 128;
	printf("%un", a);

	return 0;
}
//4294967168

128为int型,

原码、反码、补码:00000000000000000000000010000000

整型截断:

a存储为10000000

整型提升:

有符号的a为11111111111111111111111110000000----输出无符号整型---->4294967168

3.4
#include 

int 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
#include 

int 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
#include 

unsigned char i = 0;

int main()
{
	for (i = 0; i <= 255; i++)
	{
		printf("hello worldn");
	}
	return 0;
}
//死循环

unsigned char类型的取值范围:0~255,所以i <= 255恒成立,死循环

暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1015241.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号