/*
有符号整型(int) 与 无符号整型(unsigned int)的运算
1.全局变量,静态变量都是放在静态区,不初始化的时候,默认值为0。
局部变量,放在栈区,不初始化的时候,默认值是随机值,编译器会报错
2.int 与 unsigned int 进行关系运算(比较大小),int会转换为unsigned int。
除此之外,int 与 unsigned int 仍然进行正常的算术运算
*/
#include <stdio.h>
int i;//全局变量
int main() {
printf("%d\n",i);//0
i--;//-1
//sizeof()的返回结果是size_t类型的,是无符号整型。
//当有符号整型和无符号整型进行运算时,int(有符号整型)会转换为unsigned int(无符号整型)来运行
//10000000 00000000 00000000 00000001 -1的原码
//11111111 11111111 11111111 11111110 反码
//11111111 11111111 11111111 11111111 内存中-1的补码 作为无符号整型就是一个很大的数,2的32次方-1= 4,294,967,295
if (i > sizeof(i)) { //4,294,967,295 > 4
printf(">\n");
printf("%d\n", i - sizeof(i));// %d表示打印有符号整型,(-1)-4 = -5 正常的进行算术运算!
//11111111 11111111 11111111 11111111 内存中-1的补码 是无符号数
//00000000 00000000 00000000 00000100 4的补码
//11111111 11111111 11111111 11111011 内存中(-1)-4后的补码 因为输出格式为%d,所以需要转换为有符号数,最高位1为符号位,表示负数
//11111111 11111111 11111111 11111010 反码
//10000000 00000000 00000000 00000101 原码 -5
//或者使用补码来直接计算,最高位符号位权重为-2的31次方。 (-2^31) + [(2^31)-1]-4 = -5
printf("%u\n", i - sizeof(i)); // %u表示打印无符号整型
//11111111 11111111 11111111 11111111 内存中-1的补码 是无符号数
//00000000 00000000 00000000 00000100 4的补码
//11111111 11111111 11111111 11111011 内存中(-1)-4后的补码,因为输出格式为%u,所以需要转换为无符号数,
//最高位1不是符号位,结果就是(2的32次方-1)-4 = 4,294,967,291
//直接使用补码来计算,最高位不是符号位,权重为2的31次方。 [(2^32)-1] - 4 = 4,294,967,291
}
else {
printf("<\n");
}
return 0;
}
【C语言】有符号整型(int) 与 无符号整型(unsigned int)的运算
于 2023-05-11 17:17:35 首次发布