C语言中的整数类型及类型转换(为什么强制类型转换值发生改变?带你从机器码的角度分析)
文章目录
1.首先看一下C语言整数数据类型范围
注意:数值范围没有负数的则为无符号位的数,有负数范围的则为有符号位的数
- 输出时:
- %u无符号十进制整数
- %d有符号十进制整数
- %0无符号八进制
- %x无符号十六进制整数
- 在计算机中数据都是以补码形式存储的,%u无符号输出,没有符号位,是正数;%d有符号输出,有符号位,
符号位在最高位
2.有符号数和无符号数的转换(相同字长)
- 我们在C语言中常利用强制类型转换,有时候强制类型转换的结果却不是我们希望得到的,因为计算机存储数据是以补码形式存储的
- 有时候强制类型转换可能会改变数值,可能是数据类型有无符号位导致的
- 无符号位是正数就不用转换,因为正数原码=补码
- 有符号位的数,根据符号位是0还是1来判断是否需要转换,那么如果符号位是1,是负数就要转换,数值当然会不同
- 现在我们看一段代码来看一下这种特殊情况:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
short x=-4321;
unsigned short y=(unsigned short)x;
printf("x=%d,y=%u\n",x,y);
return 0;
}