文章目录:

  • 首先看一下c语言整数数据类型范围
  • 1.有符号数和无符号数的转换(相同字长)
  • 2.不同字长整数之间的转换
    • (1)大字长变量向小字长变量强制类型转换
    • (2)小字长变量向大字长变量强制类型转换

首先看一下c语言整数数据类型范围

注意:数值范围没有负数的则为无符号位的数,有负数范围的则为有符号位的数

输出时:
%u无符号十进制整数
%d有符号十进制整数
%0无符号八进制
%x无符号十六进制整数
在计算机中数据都是以补码形式存储的,%u无符号输出,没有符号位,是正数;%d有符号输出,有符号位,符号位在最高位

1.有符号数和无符号数的转换(相同字长)

  • 我们在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;
}

  • 我们可以看出y值和x值没有一点关系,咱们将其都转换成二进制,我们便知道了为什么。且看二进制转换表;

    我在自己的电脑上测试了一下,由于电脑是64位,所以转换就是64个二进制数,至于为什么16位往左所有数都是1,这就涉及到了符号扩展,详情可参考我之前的一篇文章符号扩展
  • 去掉符号位补码转原码为下图所示:

  • 其中x为补码,y为无符号二进制真值,正数的补码=原码。因为数在计算机中都是以补码形式存储的,正数的补码是自身,负数的补码需要转换,具体转换参考原码、反码、补码、移码转换规则
  • unsigned short 为无符号整数,所以它没有符号位,全是数值位,是正数。
  • 而short是有符号的整数,有符号位,符号位在最高位,需要将补码转换成原码输出。
  • 可以看出,强制类型转换结果相应位置的值不变,仅仅只改变了解释这些位的方式,是short解释,还是unsigned short 解释,这两种方式。

同样的我们再看一段代码仔细揣摩揣摩:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {unsigned short x=65535;short y=(short)x;printf("x=%u,y=%d\n",x,y);return 0;
}



  • 相应位置数值相等,但是表示结果不同,那是因为解释方式不同;unsigned short 和short两种解释 方式。

2.不同字长整数之间的转换

(1)大字长变量向小字长变量强制类型转换

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {int x=165537,u=-34991;  //int 4B  short y=(short)x,v=(short)u; // short 2Bprintf("x=%d,y=%d\n",x,y);   printf("u=%d,v=%d\n",u,v);return 0;
}

  • 当大字长变量向小字长变量强制类型转换时,系统将多余的高位字长部分直接截断舍去,低位直接赋值

(2)小字长变量向大字长变量强制类型转换

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {short x=-4321; // short 2Bint y=x; //   int 4Bunsigned short u=(unsigned short)x;unsigned int v=u;printf("x=%d,y=%d\n",x,y);   printf("u=%u,v=%u\n",u,v);return 0;
}

  • 这里我们转换成十六进制输出
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {short x=-4321; // short 2Bint y=x; //   int 4Bunsigned short u=(unsigned short)x;//无符号数,直接取当前数据类型长度的原数字x的补码长度,不用转换成原码输出unsigned int v=u;printf("x=%d,y=%d\n",x,y);   printf("u=%x,v=%u\x",u,v);return 0;
}

  • 我们发现,短字长整数到长字长整数的转换,不仅要使相应的位置相等,高位部分还会扩展为原数字的符号位
  • 注意:char类型为8位ASCII码整数,转换成int型时,高位部分补0即可。ASCII码由7位二进制数字组成。

2.2.3 C语言中的整数类型及类型转换(为什么强制类型转换值发生改变?带你从机器码的角度分析)相关推荐

  1. C语言中取整数的几种方法

    C语言中取整数的方法 1.强制转换(int) #include <stdio.h> #include <math.h> int main(){float a = 2.718;i ...

  2. c语言中短整形字节,C语言中的整数(short,int,long)

    C语言中的整数(short,int,long) 整数是编程中常用的一种数据,C语言使用int来定义整数(int 是 integer 的简写).欢迎大家阅读!更多相关信息请关注相关栏目! 现代操作系统中 ...

  3. C语言中的整数(short,int,long)

    整数是编程中常用的一种数据,C语言通常使用int来定义整数(int 是 integer 的简写). 在现代操作系统中,int 一般占用 4 个字节(Byte)的内存,共计 32 位(Bit).如果不考 ...

  4. c语言乘法超过长整数,C语言中超大整数乘法运算

    <C语言中超大整数乘法运算>由会员分享,可在线阅读,更多相关<C语言中超大整数乘法运算(8页珍藏版)>请在人人文库网上搜索. 1.C 语言中超大整数乘法运算在计算机中,长整型 ...

  5. 用C语言计算超大乘法,C语言中超大整数乘法运算.docx

    C语言中超大整数乘法运算.docx .C 语言中超大整数乘法运算在计算机中,长整型 long int 变量的范围是 -2147483648 至 2147483647 ,因此若用长整型变量做乘法运算,乘 ...

  6. 算法分析c语言大整数乘法,C语言中超大整数乘法运算

    <C语言中超大整数乘法运算>由会员分享,可在线阅读,更多相关<C语言中超大整数乘法运算(9页珍藏版)>请在人人文库网上搜索. 1.C 语言中超大整数乘法运算在计算机中,长整型 ...

  7. c语言中指针的类型,学习C语言中的指针类型

    摘要:结合我院学生十年来参加全国计算机等级考试(C语言部分)情况,通过分析成绩分布与题型关系,我们发现指针方面的题型失分率最高.在此基础上结合教学实际,本文提出学习指针知识的方法和顺序过程,并将其应用 ...

  8. C语言中的自定义类型

    C语言中的自定义类型 (一)结构体 结构体的声明 结构体是一些值的集合,这些值称为成员变量,结构体的成员可以是不同类型的变量: 结构体的声明 struct tag { member-list; }va ...

  9. Java快速入门学习笔记2 | Java语言中的基本类型

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

最新文章

  1. Kali Linux 2020.1快速修改root用户密码
  2. CodeForces - 1373E Sum of Digits(贪心)
  3. PyCharm入门教程——在编辑器中选择文本
  4. PhantomJS 一个隐形的浏览器
  5. 全网最新Spring Boot2.5.1整合Activiti5.22.0企业实战教程<UEL表达式篇>
  6. zabbix4.0添加mysql报警_Zabbix 3.4.3实现企业微信报警
  7. uwsgi模式_uwsgi配置详解
  8. PyCharm中直接使用Anaconda已安装的库
  9. 中图杯获奖作品计算机组,地理奥赛网-首页
  10. JAVA_SE_Day13
  11. python-pcl简易文档(不包含自建函数与pcl_grabber包)
  12. 基于风险平价的资产配置策略
  13. 针对AttributeError: ‘tensorflow.python.framework.ops.EagerTensor‘ ....no attribute ‘reshape‘问题的解决办法。
  14. 十个著名的思想实验-黑客帝国思想原来是(Brain in a Vat)
  15. C++算法 N阶递减三角形
  16. echarts-主标题居中,副标题居右
  17. 第六章 网上银行与电子支付-2
  18. Android数据库Realm学习(一)基本使用
  19. (2021-AAAI)Type-augmented Relation Prediction in Knowledge Graphs
  20. 图形学常见的点、线、面位置关系判断算法及其代码实现

热门文章

  1. React的组件模式
  2. 基于环信的仿QQ即时通讯的简单实现
  3. 告别2017!2018投影市场变革机遇与挑战并存
  4. windows下的MySql实现读写分离
  5. Android实训案例(七)——四大组件之中的一个Service初步了解,实现通话录音功能,抽调接口...
  6. 黄聪:wordpress源码解析-目录结构-文件调用关系(转)
  7. 几行简单代码实现DIV层上显示Tooltip效果
  8. PrintWriter write与println方法的区别
  9. 十 Java集合框架(2):Set接口
  10. openCV笔记(持续更新)