完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
你好,
在STVD(+ Cosmic)C编译器设置中,我选择* Display Errors&警告*。 我写了简单的代码: uint8_t a = 0x01; uint8_t b = 0x10; void test(uint8_t licz){ } void main(void){ test(a& 0x01); 测试(a | b); 测试(a + b); } 编译后有警告: #warning cpstm8 main.c:122(9)截断赋值 #warning cpstm8 main.c:123(9)截断赋值 #warning cpstm8 main.c:124(10)截断赋值 为了避免警告,我需要使用强制转换,例如: test((uint8_t)(a& 0x01)); (a + b)操作的结果不超过最大值8位长数据。 为什么会有警告? 所有数据都声明为8位长。 如果数据将被声明为整数16位长,那么就不需要使用强制转换。 以上来自于谷歌翻译 以下为原文 Hello, In STVD (+Cosmic) C compiler settings I choose *Display Errors & Warnings*. I wrote simple code: uint8_t a=0x01; uint8_t b=0x10; void test (uint8_t licz) { } void main (void) { test (a & 0x01); test (a | b); test (a + b); } After compilation there are warnings: #warning cpstm8 main.c:122(9) truncating assignment #warning cpstm8 main.c:123(9) truncating assignment #warning cpstm8 main.c:124(10) truncating assignment To avoid warnings I need to use casts, for example: test ((uint8_t)(a & 0x01)); The result of (a + b) operation do not exceed max value 8-bit long data. Why are there warnings? All data are declared as 8-bits long. If the data will be declared as integer 16-bits long there’s no need to use casts. |
|
相关推荐
3个回答
|
|
>>(a + b)操作的结果不超过最大值8位长数据。
是的,在你的具体情况下,它不是针对那种情况或你的常数进行优化/警告,而是抱怨值变化且240 + 230不适合的一般情况。 以上来自于谷歌翻译 以下为原文 >>The result of (a + b) operation do not exceed max value 8-bit long data. Yeah in your specific case, it is not optimizing/warning about that case or with your constants, it is complaining about the general case where the values change and 240 + 230 doesn't fit. |
|
|
|
我明白了,但为什么会有警告
测试(a | b); 和 test(a& 0x01); ? 这些表达式永远不会超过最大值8位长数据。 而且,如果将存在所有16位数据,并且例如值 uint16_t a = 0x0001; uint16_t b = 0x1000;相同的逻辑和算术运算不会产生任何警告。 以上来自于谷歌翻译 以下为原文 I understand that, but why are there warnings in case of test (a | b); and test (a & 0x01); ? These expressions will never exceed max value 8-bit long data. Moreover, if there will be all 16-bit data, and value for example uint16_t a=0x0001; uint16_t b=0x1000;The same logic and arithmetic operations don’t generate any warnings. |
|
|
|
那是因为C语言需要对int进行大量的隐式转换:如果你写的话
test((unsigned char)(a& 0x01)); test((unsigned char)(a | b));警告将消失。 如果a和b已经是16位,则隐式转换为int(即stm8上的16位)不会改变任何内容,因此没有警告。 问候, 卢卡 以上来自于谷歌翻译 以下为原文 that's because the C language requires a lot of implicit conversions to int: if you write test ((unsigned char)(a & 0x01)); test ((unsigned char)(a | b));the warnings will go away. If a and b are already 16 bits the implicit conversion to int (that is 16 bits on the stm8) does not change anything, hence no warning. Regards, Luca |
|
|
|
只有小组成员才能发言,加入小组>>
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
2761 浏览 1 评论
3248 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
1820 浏览 1 评论
3663 浏览 6 评论
6052 浏览 21 评论
1346浏览 4评论
208浏览 3评论
对H747I-DISCO写程序时将CN2的st-link复用为usart1,再次烧录时无法检测到stlink怎么解决?
364浏览 2评论
STM32G474RE芯片只是串口发个数据就发烫严重是怎么回事?
458浏览 2评论
STM32处理增量式编码器Z信号如何判断中断是正转的还是反向转的?
280浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-3 05:23 , Processed in 0.931649 second(s), Total 47, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号