C语言----类型强转

news/2025/2/8 5:51:05/

        在C语言代码中我们经常会遇到对变量进行类型强转,如果没有深入理解类型强转,很容易引入代码bug,这里总结一下C语言里的类型强转。

1)符号扩展:对于要扩展量为有符号数,扩展存储位数的方法。在新的高位字节使用当前最高有效位即符号位的值进行填充

char a=0xff;//有符号值为-1,二进制为11111111,其中最高位为符号位
short b=a;//b的有符号值为-1,二进制为1111111111111111
-----
char a=1;//有符号值为-,二进制为00000001,其中最高位为符号位
short b=a;//b的有符号值为1,二进制为0000000000000001

2)零扩展:对于要扩展量为无符号数,扩展存储位数的方法。在新的高位字节用0填充

unsigned char a=0xff;//二进制为11111111,所有值都是有效值
unsigned short b=a;//b经过零扩展后,内存中存储的值为0000000011111111

总结:若要扩展的量为有符号量,不管扩展成有符号还是无符号,都遵循符号扩展;若要扩展的为无符号量,不管扩展成有符号还是无符号,都遵循零扩展。

例:

char a=0xff;//a=-1,其为有符号量,二进制为11111111
unsigned short b=a;//此处a要进行符号扩展,b的二进制为1111111111111111
---------
unsigned char a=0xff;//a=255,为无符号量,二进制为11111111
short b=a;//此处a要进行零扩展,b的二进制为0000000011111111

方法

charshort

符号位扩展

char long 符号位扩展
char unsigned char最高位失去符号位意义,变为数据位
charunsigned short符号位扩展到short,然后从short转换为unsigned short
char unsigned long

符号位扩展到long,然后从long转换为unsigned long

charfloat符号位扩展到long,然后转到double

char

double

符号位扩展到long; 然后从long 转到double

char

long double

符号位扩展到long; 然后从long 转到long double

short

char

保留低位字节

short

long

符号位扩展

short

unsigned char

保留低位字节

short

unsigned short

最高位失去符号位意义,变为数据位

short

unsigned long

符号位扩展到long; 然后从long转到unsigned double

short

float

符号位扩展到long; 然后从long 转到float

short

double

符号位扩展到long; 然后从long 转到double

short

long double

符号位扩展到long; 然后从long 转到double

long

char

保留低位字节

long

short

保留低位字节

long

unsigned char

保留低位字节

long

unsigned short

保留低位字节

long

unsigned long

最高位失去符号位意义,变为数据位

long

Float

使用单精度浮点数表示。可能丢失精度。

long

double

使用双精度浮点数表示。可能丢失精度。

long

long double

使用双精度浮点数表示。可能丢失精度。

方法
方法

unsigned char

char

最高位作为符号位

unsigned char

short

0扩展

unsigned char

long

0扩展

unsigned char

unsigned short

0扩展

unsigned char

unsigned long

0扩展

unsigned char

float

转换到long; 再从 long 转换到float

unsigned char

double

转换到long; 再从 long 转换到double

unsigned char

long double

转换到long; 再从 long 转换到double

unsigned short

char

保留低位字节

unsigned short

char

保留低位字节

unsigned short

long

0扩展

unsigned short

unsigned char

保留低位字节

unsigned short

unsigned long

0扩展

unsigned short

float

转换到long; 再从 long 转换到float

unsigned short

double

转换到long; 再从 long 转换到double

unsigned short

long double

转换到long; 再从 long 转换到double

unsigned long

char

保留低位字节

unsigned long

short

保留低位字节

unsigned long

long

最高位作为符号位

unsigned long

unsigned char

保留低位字节

unsigned long

unsigned short

保留低位字节

unsigned long

float

转换到long; 再从 long 转换到float

unsigned long

double

直接转换成double

unsigned long

long double

转换到long; 再从 long 转换到double

  • char/short/uchar/ushort任意的混合运算,结果类型为int

  • char/short与uchar/ushort进行大小比较运算时,有符号数符号扩展为int类型,无符号数按照0扩展为int类型。最终按照int比较

  • char/short/int/uchar/ushort与uint进行大小比较运算时,转化为uint类型的比较

  • char/short/int/uchar/ushort与ulong进行大小比较运算时,转化为ulong类型比较

  • 无符号数之间的大小比较时,仍按照无符号比较

  • 有符号数之间的大小比较时,按照有符号比较


http://www.ppmy.cn/news/153045.html

相关文章

韩国公布新型多功能掌上游戏机

转自: 天极 http://rss.yesky.com/RSS_redirect.htm?yy***&toURLhttp://tvgame.yesky.com/174/2215674.shtml 韩国公司Cenix即将发布一款新掌上游戏机GMP-M6,大小将和任天堂GameBoy Micro相当,除了掌机功能外还将提供PMP、MP3播放器能力。 这款…

掌上游戏机项目开源

描述 这是一个有四款游戏的掌上游戏机,游戏有俄罗斯方块、贪吃蛇、赛车、打砖块。 主控单片机使用的是STC15F2K60S2,数码管是共阴的,共阳点阵(1脚为)(点阵有字的一边朝下,左下角为1脚&#xff…

单片机设计_贪吃蛇游戏(AT89C51)

51单片机游戏(贪吃蛇) 想要更多项目私wo!!! 一、电路设计 此电路由AT89C51最小系统、74HC595位移缓存器、8*8点阵LED屏和按键组成。 74HC595位移缓存器 74HC595是一个8位串行输入、并行输出的位移缓存器:并行输出为三态输出。在SCK 的上升…

如果有一天,掌上游戏机的屏幕可以卷起来……

随着智能手机以及手机游戏的发展,已经把当年像PSP、PSV这样火爆一时的掌上游戏机彻底钉在了历史的长河底下,现在还剩下的掌机就都是那种把当年的小霸王游戏或者仙剑1代这种像素游戏装进去的掌上红白机,怀旧玩玩还行,一直玩就会无聊…

搭建掌上游戏开发环境

PSP、GBA等游戏的开发环境,这个环境是PS2DEV社区 通过反向工程弄出来的SDK,PSP SDK在开发时的一个目标就是完全合法化。这意味着没有一行代码是从泄露的商业SDK中拿来的。PSP SDK中的任何内容都是通过反向工程firmware和已经发布的游戏得来的。下载安装d…

【单片机开发】基于stm32的掌上游戏机设计 (俄罗斯方块)

项目相关链接: 1.STM32掌机:音乐播放器 2.STM32掌机:贪吃蛇 3.STM32掌机:俄罗斯方块 (一)效果展示 思想上也就是创造一个二维矩阵,对LCD与矩阵同时操作,通过矩阵判断状态&#xff…

【单片机开发】基于stm32的掌上游戏机设计 (项目规划)

项目相关链接 1.STM32掌机:音乐播放器 2.STM32掌机:贪吃蛇 3.STM32掌机:俄罗斯方块 (一)背景介绍 期末考试终于要结束了,在这个学期结束之前终于将这个工程彻底完成了。前段时间一直在苦逼的复习&#x…

任天堂3D掌上游戏机3DS正式发布

本文转自掌上数码 http://www.pocketdigi.com/201006/201.html 在周二的E3视频游戏展上,任天堂推出了裸眼可玩3D游戏和看3D电影的3D掌上游戏机——3DS,有蓝、红、黑三种颜色可选,售价和发布日期未定, 不过该公司原先曾暗示&#x…