电子产业一站式赋能平台

PCB联盟网

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

被 char 类型的变量坑惨了!

[复制链接]

572

主题

572

帖子

4361

积分

四级会员

Rank: 4

积分
4361
发表于 2024-7-31 17:50:00 | 显示全部楼层 |阅读模式
我是老温,一名热爱学习的嵌入式工程师
8 G! X# j6 T1 D" v, X/ D关注我,一起变得更加优秀!
2 l! @$ E  @% \. G情况是这样的,我之前在开发一个物联网产品的时候,这款产品里面有涉及到温度数据的采集,需要把环境温度上报到服务器,然后同步到其他终端进行显示。% g4 u- h2 O0 S& s0 O& v& _( V
然后我心里面想,通常环境温度一般在负几十度到正几十度的区间,采用 char 类型的变量,其取值范围在 -127 ~ 127,一般都是足够的。3 J( Z+ o) J$ x' e% m
(原谅我的不严谨,对于整型值,一般建议用 int,为了省字节空间,所以用了char 类型)$ H- L* t: u4 V$ v( Q
; Z  _8 i  r. r9 s/ H: s
于是,我通常会写出类似以下的代码:
  • int update_temperature(void){    char temp_value = 0;        temp_value = get_temperature_value();    //获取温度值      update_to_cloud(temp_value);    //上传到云端}/ S' [% E) Z# X$ e, i& Z
    上述代码,采集完温度之后用char类型的变量保存起来,然后上传到云端服务器里面。
    1 ~  o- H. L$ J! N( K/ J在进行低温环境(-10℃)测试的时候,我发现了一种非常奇怪的现象,其他终端里面显示的温度值,居然是246摄氏度,好家伙,直接就收到了温度过高的告警信息。& C! `% X3 L8 d, g7 Y! h3 ?. m4 {* H

    xkkdmssa4cuBroken203214.png

    xkkdmssa4cuBroken203214.png

    , F' |; q! ^5 m: g% R2 P百思不得其解,我明明用 char 类型的变量去定义一个温度值,并且也没有超过无符号数的取值范围,按理来说应该是正确的才对。
    : }5 Y1 M7 i& h  v( S! m0 c* g1 G而且这现象有一个规律,当温度是-10时,显示246,当温度是-20时,显示236,这些现象的绝对值相加,等于256。0 _9 [# o0 \9 W3 w$ U2 S
    我突然意识到,关于 char 类型变量的取值范围,应该有一些知识点是我还没有了解清楚的。~9 L5 `1 G- {: H8 j9 Q  q2 X
    网上一搜 “c 语言 char 类型变量的取值范围”,果然,答案马上就出来了。) L$ c9 o9 }& s. F' n! h

    p4ddwnikthb640203314.jpg

    p4ddwnikthb640203314.jpg

    - j" V8 r% ^, V; K/ A6 D0 s对于 char 类型定义的变量是有符号数还是无符号数,其实是由编译器和平台来指定的,也就是说,当我们直接用 char 来定义变量的时候,它有可能是一个无符号数。+ j2 ^6 r6 F% z/ \0 m  {
    就是因为我当时用的编译器和平台,把 char 类型的变量指定为无符号类型了,当我对一个无符号类型的变量赋予一个负数值的时候,问题就出现了。
    ! W9 P; z! N% S. d看了一下 MDK 编译器里面的选项,可以强制指定 char 类型的变量为有符号类型,对于 GCC编译器,可以使用 -fsigned-char 选项。" Z3 l3 d; Z5 L8 i, i; i$ l

    e5ginm2rreo640203414.jpg

    e5ginm2rreo640203414.jpg

      Q! X8 T$ f; i+ {2 W- @" g但是,为了代码有比较好的可移植性,一般建议我们对字符变量进行显式定义,比如:有符号使用 signed char 进行定义,无符号使用 unsigned char 进行定义6 ~' J9 Q, r) p% x3 y( r
    而对于其他数据类型,比如 int , short , long , float , double 等等,则不存在类似于 char 之类的情况,这些数据类型的符号位通常都是确定好的。
    " a- t: v, x7 o基础不牢,又浪费了一个下午。 " a7 q1 U, T5 w) i$ r8 i& Y

    grz13xiduyiHurt203514.png

    grz13xiduyiHurt203514.png
    6 D+ O. b9 H" X3 w: x' N8 Q
    -END-
    4 x6 f8 F5 V4 A. N% g往期推荐:点击图片即可跳转阅读
    : w* q$ {( M$ F% ]                                                        9 C& w' y: _: V# {
                                                                    - s' Q4 K& [, d7 [  K/ A$ u7 G8 s
                                                                            ! F  {0 j& Z' H1 z4 }2 Y1 R1 e
                                                                                   
    0 Q) p" T3 \' \" P. \$ H

    slnlv2ippfb640203614.jpg

    slnlv2ippfb640203614.jpg

      r6 X) {& k, [                                                                               
    2 F0 [' f, Z$ s& A                                                                                        嵌入式 C 语言知识点,动态变长数组
    6 v7 |5 x. O# K- G  I- _                                                        $ i1 B- E' H  U% F' N5 {' l: V
                                                                    / y# U4 Q( t1 {5 ?; K, Z
                                                                           
    0 R0 Z! H; |; {) O: B" ?                                                                               
    / _; {  I% c9 C6 D' h; U

    voo5m24qfra640203715.jpg

    voo5m24qfra640203715.jpg
    $ k% x9 a$ C# J! n/ {( j. q! _
                                                                                   
    1 n5 ~' f6 n( D                                                                                        嵌入式 C 语言特性,指定初始化器' K; R4 f4 R2 }$ x. q
                                                                   
    & k' \8 ]4 M  H. J) I- J8 p& E                                                                        . K1 r% {$ b8 c0 p2 J. W% \; M
                                                                                   
    # \- V0 \  X( p& j, l3 ^8 @' z" S

    gik1al4snrr640203815.jpg

    gik1al4snrr640203815.jpg
    2 K( M. S! K  {4 h; T" K
                                                                                    0 r* j; M" _/ w
                                                                                            嵌入式 C 语言知识点,掩码结构体
    6 y( i6 \/ x1 o我是老温,一名热爱学习的嵌入式工程师
    9 c+ x. N7 W, ?; G+ n关注我,一起变得更加优秀!
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则


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