打印
[STM32F1]

keil写STM32程序出现literal treated as "long long"

[复制链接]
1384|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sanfuzi|  楼主 | 2024-2-29 12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
unsigned int value2=0x80000000;
value2编译时不产生警告,而value4就产生警告
解决方法:
上面这个语句,需要先将int类型,转换成unsigned int类型,再赋值给value4;
unsigned int value2=0x80000000;
如果你想要明白告诉编译器,2147483648就是unsigned 类型,你可以这么做.
unsigned int value4=2147483648u;

使用特权

评论回复
沙发
digit0| | 2024-2-29 13:09 | 只看该作者
意味着编译器检测到了一个整数字面常量的值超出了int类型的表示范围,并且没有显式指定类型

使用特权

评论回复
板凳
理想阳| | 2024-2-29 13:09 | 只看该作者
解决这个问题的方法是在赋值时明确指定字面常量的类型为unsigned int,通过添加后缀U来进行类型转换

使用特权

评论回复
地板
ClarkLLOTP| | 2024-2-29 17:34 | 只看该作者
习惯在前面加括号强转

使用特权

评论回复
5
FranklinUNK| | 2024-2-29 19:27 | 只看该作者
警告不用管就行了

使用特权

评论回复
6
yangjiaxu| | 2024-2-29 21:49 | 只看该作者
这个bug还没遇到过,但是感觉应该就是语法的问题吧

使用特权

评论回复
7
classroom| | 2024-8-15 17:26 | 只看该作者
在Keil MDK环境中编写STM32程序时,如果遇到“literal treated as 'long long'”的警告,这通常是因为你使用了超出标准整型(如int或unsigned int)范围的大整数字面量,而编译器默认将这些字面量解释为long long类型。

使用特权

评论回复
8
flycamelaaa| | 2024-8-15 17:26 | 只看该作者
避免使用过大的字面量

使用特权

评论回复
9
laocuo1142| | 2024-8-15 19:26 | 只看该作者
使用合适的字面量后缀

使用特权

评论回复
10
狄克爱老虎油| | 2024-8-17 23:14 | 只看该作者
强制转换一下应该就行吧

使用特权

评论回复
11
grfqq325| | 2024-8-28 12:05 | 只看该作者
在 C 语言中,常量的默认类型是 int,但如果数值超出 int 类型的表示范围,它将被视为一个更大的类型,如 unsigned int 或 long。

使用特权

评论回复
12
Clyde011| | 2025-3-18 08:23 | 只看该作者
这个问题算是 C 语言的一个小坑,特别是对初学者来说,记住给大数加 u 可以避免很多潜在问题。

使用特权

评论回复
13
公羊子丹| | 2025-3-18 08:24 | 只看该作者
Keil 的编译器可能默认把 0x80000000 识别为 signed int,所以直接赋值给 unsigned int 时不会报错,但用十进制就不一样了。

使用特权

评论回复
14
周半梅| | 2025-3-18 08:25 | 只看该作者
这个问题主要是 2147483648 超出了 int 的范围,默认会被当作 long long,加个 u 确保它是 unsigned int 就行了。

使用特权

评论回复
15
帛灿灿| | 2025-3-18 08:27 | 只看该作者
你可以试试 #define VALUE (2147483648u),然后用这个 VALUE 赋值给 unsigned int,看看编译器还报不报警告。

使用特权

评论回复
16
童雨竹| | 2025-3-18 08:28 | 只看该作者
这个问题其实跟编译器的类型推导规则有关,Keil 可能对十六进制和十进制的处理逻辑不一样。

使用特权

评论回复
17
万图| | 2025-3-18 08:29 | 只看该作者
你可以用 unsigned int value4 = (unsigned int)2147483648;,这样也能避免警告,不过加 u 更直观。

使用特权

评论回复
18
Bblythe| | 2025-3-18 08:31 | 只看该作者
你用的是哪种 C 语言标准?如果是 C99 或者更新的版本,这种情况一般会有更严格的类型检查。

使用特权

评论回复
19
Wordsworth| | 2025-3-18 08:33 | 只看该作者
0x80000000 在 int 里是负数,编译器可能隐式转换成 unsigned int,但 2147483648 是个大于 int 范围的数,所以要显式告诉编译器。

使用特权

评论回复
20
Pulitzer| | 2025-3-18 08:35 | 只看该作者
0x80000000 这种情况在不同编译器里可能会有不同的处理方式,你试过在 GCC 或 IAR 里编译看看吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

3190

帖子

1

粉丝