整型提升
整型提升的概念
在表达式计算时,各种整型首先要提升为int类型,如果int类型不足以表示则要提升为unsigned int类型;然后执行表达式的运算。
整型提升的方法
整型提升按照变量数据类型的符号位来提升:
1.先看该数据是signed 还是unsigned。
2.再看此时符号位。
signed则1补1,0补0;unsined直接补0;
示例
#include<stdio.h>
int main()
{
signed char a = -1;
unsigned char b = -1;
printf("a=%d,b=%d", a, b);
return 0;
}
输出 a=-1,b=255
int类型大小4字节下-1的存储
10000000 00000000 00000000 00000001 -1的原码
11111111 11111111 11111111 111111110 反码
11111111 11111111 11111111 111111111 补码
char类型大小一字节,进行截断处理,-1的补码变为
11111111
在输出时进行整型提升,由上述方法可知,对于signed char a = -1;整型提升后
补码为
11111111 11111111 11111111 11111111
转换为原码为
10000000 00000000 00000000 00000001
故a=-1
对于unsigned char a = -1;整型提升后
补码为
00000000 00000000 00000000 11111111
正数转换为原码仍为
00000000 00000000 00000000 111111111
故b=255
算数转换
算数转换的概念
如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数转换为另一个操作数的类型,否则操作就无法进行。
算数转换的次序
下表由下至上转换
long double
double
float
unsigned long int
long int
unsigned int
int
示例1
#include<stdio.h>
int main()
{
int a = -1;
unsigned int b = 1;
if (a > b)
printf("-1 > 1");
else
printf("-1 < 1");
}
a,b为不同类型,要进行算数转换,由次序可知a类型要从int-----> unsigned int
10000000 00000000 00000000 00000001 a的原码
11111111 11111111 11111111 111111111 a的补码
将a的补码视为unsigned int类型(无符号位),所以比较大小时a的实际值为二进制(11111111 11111111 11111111 111111111)的大小,必然大于b二进制(00000000 00000000 00000000 00000001)
所以输出 -1 > 1
示例2
int main()
{
//strlen函数返回值是unsigned int 类型
if (strlen("abc") - strlen("abcdef") > 0)
printf(">");
else
printf("<");
}
输出 >
#include<stdio.h>
#include<assert.h>
int my_strlen(const char* str)
{
assert(str);
int count = 0;
while (*str)
{
str++;
count++;
}
return count;
}
int main()
{
if (my_strlen("abc") - my_strlen("abcdef") > 0)
printf(">");
else
printf("<");
}
输出<
对于strlen函数中3-6>0,因为strlen函数返回值为unsigned int类型,与0比较大小,进行算数转换,将-3视为unsigned类型(方法与上述类似)必然大于0。
而my_strlen函数中3-6<0,自定义的该函数返回值为int类型,3-6=-3,-3与0两数类型相同故3-6<0。
感谢您的阅读