当前位置: 首页 > news >正文

C语言中整数类型及其类型转换

1.数据的存储和排列

 是的,在C语言中,整数类型通常以补码(two's complement)形式存储在内存中。这是因为补码表示法在处理有符号整数的加减运算上更为简便和高效。

 

2.有符号数和无符号数之间的转换

在C语言中,有符号数和无符号数之间的转换可以通过类型转换(type casting)实现。需要注意的是,这种转换会影响数值的解释。

有符号数转无符号数

将有符号数转换为无符号数时,二进制表示保持不变,但解释方式不同。

#include <stdio.h>int main(){int signed_num = -1;unsigned int unsigned_num = (unsigned int)signed_num; // 0xFFFFFFFFprintf("signed_num = %d, unsigned_num = %u\n", signed_num, unsigned_num);return 0;
} 

输出结果:

 

有符号数转无符号数在内存中的解释:

变量名内存地址二进制表示解释
signed_num0x7fffeeaee1011111111 11111111 11111111 11111111-1 (有符号数)
unsigned_num0x7fffeeaee1411111111 11111111 11111111 111111114294967295 (无符号数)

 可以看到二进制表示保持不变,只是改变了解释方式

无符号数转有符号数

将无符号数转换为有符号数时,同样二进制表示保持不变,但解释方式不同。

#include <stdio.h>int main(){unsigned int unsigned_num = 4294967295; // 0xFFFFFFFFint signed_num = (int)unsigned_num; // -1printf("unsigned_num = %u, signed_num = %d\n", unsigned_num, signed_num);return 0;
} 

 输出结果:

 

无符号数转有符号数在内存中的解释:

变量名内存地址二进制表示解释
unsigned_num0x7fffeeaee1811111111 11111111 11111111 111111114294967295 (无符号数)
signed_num0x7fffeeaee1c11111111 11111111 11111111 11111111-1 (有符号数)

 可以看到二进制表示保持不变,只是改变了解释方式

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

 

在C语言中,不同字长的整数之间的转换主要涉及位宽扩展和截断操作。

从小字长向大字长扩展

对于有符号数,可以通过符号扩展实现扩展;对于无符号数,可以通过零扩展实现扩展。

#include <stdio.h>int main(){char small_num = -1;int large_num = (int)small_num; // 符号扩展,小数到大数printf("small_num = %d, large_num = %d\n", small_num, large_num);unsigned char usmall_num = 255;unsigned int ularge_num = (unsigned int)usmall_num; // 零扩展printf("usmall_num = %u, ularge_num = %u\n", usmall_num, ularge_num);return 0;
} 

输出结果: 

 

从小字长向大字长扩展在内存中的解释:

变量名内存地址二进制表示解释
small_num0x7fffeeaee2011111111-1 (8位有符号数)
large_num0x7fffeeaee2411111111 11111111 11111111 11111111-1 (32位有符号数)
变量名内存地址二进制表示解释
usmall_num0x7fffeeaee2811111111255 (8位无符号数)
ularge_num0x7fffeeaee2c00000000 00000000 00000000 11111111255 (32位无符号数)

 对于有符号数,从小字长向大字长可以通过符号扩展实现扩展;

从大字长向小字长截断

当将大字长整数转换为小字长整数时,高位会被截断,只保留低位。

#include <stdio.h>int main(){int large_num = 257; // 0x00000101char small_num = (char)large_num; // 0x01printf("large_num = %d, small_num = %d\n", large_num, small_num);unsigned int ularge_num = 65537; // 0x00010001unsigned char usmall_num = (unsigned char)ularge_num; // 0x01printf("ularge_num = %u, usmall_num = %u\n", ularge_num, usmall_num);return 0;
} 

 输出结果:

 大字长到小字长整数之间的转换在内存中的解释:

数据类型变量名内存地址示例二进制表示解释
intlarge_num2570x701000000000 00000000 00000001 00000001257
charsmall_num10x7000000000011(截断)
unsigned intularge_num655370x701400000000 00000001 00000000 0000000165537
unsigned charusmall_num10x7008000000011(截断)

可以看到 大字长到小字长整数之间的转换在是直接截去多余的高位,只保留对应得低位。

http://www.lryc.cn/news/415642.html

相关文章:

  • powerjob连接postgresql数据库(支持docker部署)
  • 浅谈位运算及其应用(c++)
  • Git版本管理中下列不适于Git的本地工作区域的是
  • webGL + WebGIS + 数据可视化
  • 职场“老油条”的常规操作,会让你少走许多弯路,尤其这三点
  • Ceres Cuda加速
  • 微信小程序生成小程序转发链接,携带参数跳转到另外一个页面
  • 图解RocketMQ之消息如何存储
  • 2024年中国信创产业发展白皮书精简版
  • Redis2-Redis常见命令
  • 一天攻克一个知识点 —— 设计模式之动态代理
  • 数据采集与预处理【大数据导论】
  • 白骑士的PyCharm教学进阶篇 2.2 高级调试技术
  • [网鼎杯]2018Unfinish
  • Java算法-力扣leetcode-383. 赎金信
  • 使用idea对spring全家桶的各种项目进行创建
  • FAT32、NTFS、FAT的区别
  • 捉虫笔记(二)之 杀软请你自重点
  • python学习之路 - python的函数
  • 使用SpringBoot+Vue3开发项目(2)---- 设计文章分类的相关接口及页面
  • Layui---toolbar与 tool的区别
  • U-Net++原理与实现(含Pytorch和TensorFlow源码)
  • 产品心理学:啦啦队效应
  • AC+AP组网
  • 2024.8.05(glibc的安装及MySQL的安全用户角色权限)
  • 【精选】6款一键生成论文的软件3000字论文网站
  • 如何使用 PHP Simple HTML DOM Parser 轻松获取网页中的特定数据
  • Linux笔记 --- 传统链表
  • C语言的编译(预处理操作)+链接
  • FFmpeg实战 - 解复用与解码