电子产业一站式赋能平台

PCB联盟网

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

被 char 类型的变量坑惨了!

[复制链接]

572

主题

572

帖子

4361

积分

四级会员

Rank: 4

积分
4361
发表于 2024-7-31 17:50:00 | 显示全部楼层 |阅读模式
我是老温,一名热爱学习的嵌入式工程师$ N. }1 }& U5 J& {/ g* z$ ~8 _
关注我,一起变得更加优秀!
" v& @; x9 f4 r# }( K情况是这样的,我之前在开发一个物联网产品的时候,这款产品里面有涉及到温度数据的采集,需要把环境温度上报到服务器,然后同步到其他终端进行显示。
  z5 ]  B# Q+ z  t8 W- d+ H然后我心里面想,通常环境温度一般在负几十度到正几十度的区间,采用 char 类型的变量,其取值范围在 -127 ~ 127,一般都是足够的。/ T( y6 A! @$ q  M0 m8 `; O
(原谅我的不严谨,对于整型值,一般建议用 int,为了省字节空间,所以用了char 类型)
# Q2 r( h' S7 E0 D& r) s4 _. J# A( B9 a
于是,我通常会写出类似以下的代码:
  • int update_temperature(void){    char temp_value = 0;        temp_value = get_temperature_value();    //获取温度值      update_to_cloud(temp_value);    //上传到云端}- d9 p; m6 {  k) a
    上述代码,采集完温度之后用char类型的变量保存起来,然后上传到云端服务器里面。$ w6 f' E% {% \7 s9 z: @0 i
    在进行低温环境(-10℃)测试的时候,我发现了一种非常奇怪的现象,其他终端里面显示的温度值,居然是246摄氏度,好家伙,直接就收到了温度过高的告警信息。
    # s/ @5 Q# B8 p7 }+ b1 n

    ixvmq0dqgcnBroken3564926.png

    ixvmq0dqgcnBroken3564926.png

    2 I6 l3 ~6 _  r  d1 y! ]% e百思不得其解,我明明用 char 类型的变量去定义一个温度值,并且也没有超过无符号数的取值范围,按理来说应该是正确的才对。  h1 a+ ?* g& @- n$ V1 o: w
    而且这现象有一个规律,当温度是-10时,显示246,当温度是-20时,显示236,这些现象的绝对值相加,等于256。
      a: p& v9 y( m0 ^我突然意识到,关于 char 类型变量的取值范围,应该有一些知识点是我还没有了解清楚的。~# G( l+ k4 s5 O8 [, G4 H+ P
    网上一搜 “c 语言 char 类型变量的取值范围”,果然,答案马上就出来了。  l9 |0 V0 O4 {3 D/ h

    asgkzyodn0g6403565026.jpg

    asgkzyodn0g6403565026.jpg

    . m! W- t: ~, L/ M; N( L对于 char 类型定义的变量是有符号数还是无符号数,其实是由编译器和平台来指定的,也就是说,当我们直接用 char 来定义变量的时候,它有可能是一个无符号数。8 Z1 f, a* b6 \3 B- d
    就是因为我当时用的编译器和平台,把 char 类型的变量指定为无符号类型了,当我对一个无符号类型的变量赋予一个负数值的时候,问题就出现了。8 T# Z# f" X1 f/ \7 y
    看了一下 MDK 编译器里面的选项,可以强制指定 char 类型的变量为有符号类型,对于 GCC编译器,可以使用 -fsigned-char 选项。5 @8 }8 Q* E0 V  Q: r

    ismotsyst5r6403565126.jpg

    ismotsyst5r6403565126.jpg
    / T$ I, D" @6 g
    但是,为了代码有比较好的可移植性,一般建议我们对字符变量进行显式定义,比如:有符号使用 signed char 进行定义,无符号使用 unsigned char 进行定义$ m* C" C& [0 w% t0 j  |+ I
    而对于其他数据类型,比如 int , short , long , float , double 等等,则不存在类似于 char 之类的情况,这些数据类型的符号位通常都是确定好的。
      x2 e5 d( Q6 J6 A; l基础不牢,又浪费了一个下午。
    8 g: p, h6 ]1 f2 h# t+ i- t

    glabut1xfenHurt3565226.png

    glabut1xfenHurt3565226.png

    1 i$ j$ ]/ c, w-END-
    7 ]1 j/ _- d/ U  W往期推荐:点击图片即可跳转阅读
    , L) U" I  L% I6 v                                                       
    $ Z6 `& ?* U. g# {                                                                - Q8 s4 p2 C7 R% U& l% J
                                                                            8 {; n, p# p. `* B9 \
                                                                                    & P4 M: R/ S5 n% F7 C& ?

    xwmqdvop3yd6403565326.jpg

    xwmqdvop3yd6403565326.jpg

      o  {& ~4 F2 S                                                                               
    % ], v) W& W3 r                                                                                        嵌入式 C 语言知识点,动态变长数组
    * q; G% X1 [) `: o* W                                                       
    " f5 _% N: a# d9 @9 _                                                               
    0 X5 ]+ Y% p, u* t' Y7 q! ]) j( F                                                                       
    ! ~9 Z& M, \7 S: @                                                                               
    7 D0 _0 I4 T- I2 X

    hz0mcfl4dwm6403565426.jpg

    hz0mcfl4dwm6403565426.jpg
    7 P- e  ]; o6 S7 h- s
                                                                                   
    8 _# y. X2 J( F9 ~                                                                                        嵌入式 C 语言特性,指定初始化器9 W& l" q! ]3 X, h+ w9 }; i
                                                                   
    , H' \! z  `3 A4 ~$ Z                                                                        3 D& ]( p- z/ D8 B. ]9 l! ?
                                                                                    # a6 y3 O0 {) ?# m5 E7 N

    h2n5kqvbxwh6403565526.jpg

    h2n5kqvbxwh6403565526.jpg
    1 E& I! g; o! E3 y) u
                                                                                   
    . q, @0 H4 ~% a$ l$ P( S! d( o6 l) Y                                                                                        嵌入式 C 语言知识点,掩码结构体
    & b! c3 P) s5 S8 H7 z0 _6 P2 J8 J我是老温,一名热爱学习的嵌入式工程师% p" ~& x8 p+ w* f# s2 \# a3 K: T
    关注我,一起变得更加优秀!
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则


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