电子产业一站式赋能平台

PCB联盟网

搜索
查看: 87|回复: 0
收起左侧

被 char 类型的变量坑惨了!

[复制链接]

572

主题

572

帖子

4361

积分

四级会员

Rank: 4

积分
4361
发表于 2024-7-31 17:50:00 | 显示全部楼层 |阅读模式
我是老温,一名热爱学习的嵌入式工程师
. ^- i. C, b) y7 X9 h+ d) ^$ R: a. u关注我,一起变得更加优秀!" O: ]' z' c7 _9 \& y8 B' t5 @
情况是这样的,我之前在开发一个物联网产品的时候,这款产品里面有涉及到温度数据的采集,需要把环境温度上报到服务器,然后同步到其他终端进行显示。. D: N: w6 i: Q+ ^
然后我心里面想,通常环境温度一般在负几十度到正几十度的区间,采用 char 类型的变量,其取值范围在 -127 ~ 127,一般都是足够的。
4 a- _% P3 W: k; n(原谅我的不严谨,对于整型值,一般建议用 int,为了省字节空间,所以用了char 类型)
3 [. U/ z  f9 O2 B! z
5 e; _* s  E! j8 D- V- n+ Z于是,我通常会写出类似以下的代码:
  • int update_temperature(void){    char temp_value = 0;        temp_value = get_temperature_value();    //获取温度值      update_to_cloud(temp_value);    //上传到云端}
    . s1 J( |/ S7 k5 [上述代码,采集完温度之后用char类型的变量保存起来,然后上传到云端服务器里面。. y. s+ y" S$ R% p8 `
    在进行低温环境(-10℃)测试的时候,我发现了一种非常奇怪的现象,其他终端里面显示的温度值,居然是246摄氏度,好家伙,直接就收到了温度过高的告警信息。6 M: }9 g. F! W) G/ x3 u

    dz4tr1ke2gyBroken16690624.png

    dz4tr1ke2gyBroken16690624.png
    : n) d% n  b7 J% ^0 e
    百思不得其解,我明明用 char 类型的变量去定义一个温度值,并且也没有超过无符号数的取值范围,按理来说应该是正确的才对。( x: o8 A# O4 j% d+ P
    而且这现象有一个规律,当温度是-10时,显示246,当温度是-20时,显示236,这些现象的绝对值相加,等于256。
    8 ~3 y5 |! N) y7 ~. g我突然意识到,关于 char 类型变量的取值范围,应该有一些知识点是我还没有了解清楚的。~
    ( A3 r) S& ?& w% l网上一搜 “c 语言 char 类型变量的取值范围”,果然,答案马上就出来了。$ g& q$ a' Y3 N/ Q) L' I  ^% O- l% o

    pykv1lwvnvm64016690724.jpg

    pykv1lwvnvm64016690724.jpg

    2 n1 x) z0 C" @' ?( o对于 char 类型定义的变量是有符号数还是无符号数,其实是由编译器和平台来指定的,也就是说,当我们直接用 char 来定义变量的时候,它有可能是一个无符号数。, N1 g4 t) P& \  m. e& D
    就是因为我当时用的编译器和平台,把 char 类型的变量指定为无符号类型了,当我对一个无符号类型的变量赋予一个负数值的时候,问题就出现了。/ z, s5 k: Y6 l" o3 [+ K: c4 l
    看了一下 MDK 编译器里面的选项,可以强制指定 char 类型的变量为有符号类型,对于 GCC编译器,可以使用 -fsigned-char 选项。
    . _0 @, v+ n- {7 ]+ e0 |

    0ybrymvy10b64016690824.jpg

    0ybrymvy10b64016690824.jpg

    ! o# v. i1 L, C# J* e但是,为了代码有比较好的可移植性,一般建议我们对字符变量进行显式定义,比如:有符号使用 signed char 进行定义,无符号使用 unsigned char 进行定义
    * J6 c/ c' V' c" _而对于其他数据类型,比如 int , short , long , float , double 等等,则不存在类似于 char 之类的情况,这些数据类型的符号位通常都是确定好的。
    # m3 A' A' F4 |# c基础不牢,又浪费了一个下午。 ( d' t# B& ^! B5 V6 l/ M

    0yps543zobnHurt16690924.png

    0yps543zobnHurt16690924.png
    2 p% y, ^( v; l3 ~9 c0 a
    -END-
    / q6 ~' e5 m$ ^0 B, W往期推荐:点击图片即可跳转阅读) R" }+ s* L0 j* A7 a
                                                            " j9 g# L; X9 |8 t- i
                                                                    # x/ k& v( r8 T, c6 _
                                                                            1 n: t# B' y# t# W3 I, w" u4 _
                                                                                   
    & L& \6 a8 F( B: A2 {$ \

    wksorbw44wq64016691024.jpg

    wksorbw44wq64016691024.jpg
    * w3 f' r  h% w: [3 s" N
                                                                                    . b9 `' E2 e5 C# T. m8 a5 G$ n
                                                                                            嵌入式 C 语言知识点,动态变长数组
    7 e: G' ^0 S# n1 i0 P                                                       
    2 ]  O' X$ H# E4 C2 f' }+ ~. r                                                               
    / t3 \# y9 O( J* A! ^                                                                       
    ; `; Y3 T* f4 @1 Z4 F  @8 @1 [( \                                                                                4 j3 `- o+ i% ]

    mpekzzb4dou64016691124.jpg

    mpekzzb4dou64016691124.jpg

    1 ~4 r" g3 B: Z. b4 ~                                                                                6 I, j# A4 |% a& x+ O
                                                                                            嵌入式 C 语言特性,指定初始化器
    6 C" l3 E6 i! o( t( c4 w% b+ b                                                                - q6 S" o4 {6 g/ k, X3 Z' U0 R
                                                                            6 I- |/ E' s) d- w( {
                                                                                   
    1 J2 Q# l! R8 {

    tqhfhtypdqc64016691224.jpg

    tqhfhtypdqc64016691224.jpg

    + e5 x7 i, O3 H. W& g1 Q3 p8 ~                                                                                , y3 Z7 u: w8 a9 z: r4 y$ E
                                                                                            嵌入式 C 语言知识点,掩码结构体
    - Q2 y% H# ^5 O我是老温,一名热爱学习的嵌入式工程师% y4 B. n7 X" @, G4 z# `
    关注我,一起变得更加优秀!
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表