Keil C中不同数据类型变量间可否相互赋值?如果可以,结果如何? 您所在的位置:网站首页 char赋值给int Keil C中不同数据类型变量间可否相互赋值?如果可以,结果如何?

Keil C中不同数据类型变量间可否相互赋值?如果可以,结果如何?

2023-08-10 04:02| 来源: 网络整理| 查看: 265

       signed char 是 8 位有符号整数,unsigned char 是 8 位 无符号整数。signed char的取值范围为:-128~127,unsigned char的取值范围为0~255。如果声明两个变量如下:

signed char tem1; unsigned char tem2;

     将255赋值给tem2,这个不会,有问题,如果再将tem2赋值给tem1,在keil中编译会不会出错?为什么?如果不会出错,tem1的值会变成对少?

       将-2赋值给tem1,这个也不会有问题,如果再将tem1赋值给tem2,在keil中编译会不会出错?

如果不会出错,tem2的值会变成对少?请看下面验证结果:

头文件:

/*main.h Designed by Bill Liu Version 0.0 Modified last by Bill Liu on 12/15/2021 */ #ifndef __MAIN_H_ #define __MAIN_H_ #include "mtype.h" #include "delay.h" #include "stcuart.h" #include "stcio.h" #include "myport.h" #include "stcadc.h" const FSYSCLOCK FSCLK = F30MHz; //define system clock frequency 30MHz, FSYSCLOCK was defined in mtype.h const ui32 FSCLK1 = 30000000L; //define system clock frequency 30MHz ui16 code Vbg_ROM _at_ 0xf3f7; //band gap voltage stord at memory end address -8 i8 mstr[25] =""; void SundBuzzerx10ms(ui8 x); #endif

       源文件:

/*main.c Designed by Bill Liu Version 0.0 Modified last by Bill Liu on 12/16/2021 */ #include "main.h" signed char tem1; unsigned char tem2; void main() { STCIO_InitPortsBits(P0|P1|P2|P3|P4, 0xFF, BI_IO); P3 = 0xFF; P0 = 0xFF; UartS1_Init(VBAUD_8BITS,G1,T2,9600); STCIO_InitP3Bit(SCT_BIT1, PP_OUT); //ADC_Init(1); SundBuzzerx10ms(50); Delay10xms(50, FSCLK); SundBuzzerx10ms(50); tem2 = 255; tem1 = tem2; while(1) { LongToString(tem1,mstr); UartS1_SendString(mstr); UartS1_SendString("\r\n"); tem2 = -2; LongToString(tem2,mstr); UartS1_SendString(mstr); UartS1_SendString("\r\n"); Delay10xms(200, FSCLK); } } //End of main() //********************************************* void SundBuzzerx10ms(ui8 x) { BUZZER = 0; Delay10xms(x, FSCLK); BUZZER = 1; } //End of SundBuzzerx10ms(ui8 x)

编译结果:

 没有错误,下载到单片加,在串口助手上看到的结果如下:

       为什么会这样?我们知道整数的存储是存储补码,正整数的补码是本身,负整数的补码使其反码加1。对与有符号整数,地址的最高位存储符号位,如果是负数符号位则为1,如果是正数符号位为0。255,-1及254,-2只是同一二进制数(或十六进制数)的不同解析,在内存中是完全相同的。

       将以个16位变量的值赋值给8位变量实际是将其低8位赋值给8位变量,如下:

/*main.c Designed by Bill Liu Version 0.0 Modified last by Bill Liu on 12/16/2021 */ #include "main.h" signed int tem1; unsigned char tem2; void main() { STCIO_InitPortsBits(P0|P1|P2|P3|P4, 0xFF, BI_IO); P3 = 0xFF; P0 = 0xFF; UartS1_Init(VBAUD_8BITS,G1,T2,9600); STCIO_InitP3Bit(SCT_BIT1, PP_OUT); //ADC_Init(1); SundBuzzerx10ms(50); Delay10xms(50, FSCLK); SundBuzzerx10ms(50); tem1 = 0xF3F3; while(1) { LongToString(tem1,mstr); UartS1_SendString(mstr); UartS1_SendString("\r\n"); tem2 = tem1; LongToString(tem2,mstr); UartS1_SendString(mstr); UartS1_SendString("\r\n"); Delay10xms(200, FSCLK); } } //End of main() //********************************************* void SundBuzzerx10ms(ui8 x) { BUZZER = 0; Delay10xms(x, FSCLK); BUZZER = 1; } //End of SundBuzzerx10ms(ui8 x)

串口助手中的结果如下:

0xF3  解析为unsigned char就是243。

         如果将一个浮点数赋值给八位变量结果又会如何?是不是把整数部分的二进制低八位赋值给八位变量?请看下面结果:

/*main.c Designed by Bill Liu Version 0.0 Modified last by Bill Liu on 12/16/2021 */ #include "main.h" float tem1; unsigned char tem2; void main() { STCIO_InitPortsBits(P0|P1|P2|P3|P4, 0xFF, BI_IO); P3 = 0xFF; P0 = 0xFF; UartS1_Init(VBAUD_8BITS,G1,T2,9600); STCIO_InitP3Bit(SCT_BIT1, PP_OUT); //ADC_Init(1); SundBuzzerx10ms(50); Delay10xms(50, FSCLK); SundBuzzerx10ms(50); tem1 = 125.123456; while(1) { LongToString(tem1,mstr); UartS1_SendString(mstr); UartS1_SendString("\r\n"); tem2 = tem1; LongToString(tem2,mstr); UartS1_SendString(mstr); UartS1_SendString("\r\n"); Delay10xms(200, FSCLK); } } //End of main() //********************************************* void SundBuzzerx10ms(ui8 x) { BUZZER = 0; Delay10xms(x, FSCLK); BUZZER = 1; } //End of SundBuzzerx10ms(ui8 x)

串口助手中的结果如下:

 确实是把整数部分的二进制低八位赋值给八位变量。

       如果signed char 赋值给signed int是如何赋值呢?是符号位赋值给符号位,整数位赋值给低7位。这个大家都明白。

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有