电子产业一站式赋能平台

PCB联盟网

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

被 char 类型的变量坑惨了!

[复制链接]

572

主题

572

帖子

4361

积分

四级会员

Rank: 4

积分
4361
发表于 2024-7-31 17:50:00 | 显示全部楼层 |阅读模式
我是老温,一名热爱学习的嵌入式工程师
1 V1 H# ^( ^1 K关注我,一起变得更加优秀!) j8 z3 t* B5 J$ _" G
情况是这样的,我之前在开发一个物联网产品的时候,这款产品里面有涉及到温度数据的采集,需要把环境温度上报到服务器,然后同步到其他终端进行显示。  v# X4 r2 ]( T' {# `) W  q/ R
然后我心里面想,通常环境温度一般在负几十度到正几十度的区间,采用 char 类型的变量,其取值范围在 -127 ~ 127,一般都是足够的。
& u: o6 I9 f) o2 A3 y3 A9 g(原谅我的不严谨,对于整型值,一般建议用 int,为了省字节空间,所以用了char 类型)
+ A- ^9 A- G; e0 w
' q! }. y/ E0 R/ O8 \. M  r于是,我通常会写出类似以下的代码:
  • int update_temperature(void){    char temp_value = 0;        temp_value = get_temperature_value();    //获取温度值      update_to_cloud(temp_value);    //上传到云端}
    0 ?5 Y+ E* q3 ]( F% `% J( i上述代码,采集完温度之后用char类型的变量保存起来,然后上传到云端服务器里面。
    5 Z) Z$ R+ j. K. @) z) T在进行低温环境(-10℃)测试的时候,我发现了一种非常奇怪的现象,其他终端里面显示的温度值,居然是246摄氏度,好家伙,直接就收到了温度过高的告警信息。
    5 A" X/ L: K+ |5 q. b" k, M9 s( G8 Q

    115wew2q1oyBroken26498040.png

    115wew2q1oyBroken26498040.png

    2 Q- i7 T7 @! Z百思不得其解,我明明用 char 类型的变量去定义一个温度值,并且也没有超过无符号数的取值范围,按理来说应该是正确的才对。6 f: Z& L) v2 S" Q* `8 Z  C, `
    而且这现象有一个规律,当温度是-10时,显示246,当温度是-20时,显示236,这些现象的绝对值相加,等于256。: `1 y" f2 }; I! W' B" N0 m' a
    我突然意识到,关于 char 类型变量的取值范围,应该有一些知识点是我还没有了解清楚的。~+ }& S3 d. P! m, d- @8 i, w3 o% M
    网上一搜 “c 语言 char 类型变量的取值范围”,果然,答案马上就出来了。/ C( P* k' l3 Q

    zgcqaa5jifz64026498140.jpg

    zgcqaa5jifz64026498140.jpg

    3 A2 h' p7 q4 J$ K. n对于 char 类型定义的变量是有符号数还是无符号数,其实是由编译器和平台来指定的,也就是说,当我们直接用 char 来定义变量的时候,它有可能是一个无符号数。
    , _5 V: U$ \2 @8 K% l就是因为我当时用的编译器和平台,把 char 类型的变量指定为无符号类型了,当我对一个无符号类型的变量赋予一个负数值的时候,问题就出现了。) O  z1 e3 ~4 O' J/ l
    看了一下 MDK 编译器里面的选项,可以强制指定 char 类型的变量为有符号类型,对于 GCC编译器,可以使用 -fsigned-char 选项。
    5 L4 x: Y# q! P/ L; |

    ey1gygibroh64026498240.jpg

    ey1gygibroh64026498240.jpg

    0 e! y; V7 {$ g. W& w但是,为了代码有比较好的可移植性,一般建议我们对字符变量进行显式定义,比如:有符号使用 signed char 进行定义,无符号使用 unsigned char 进行定义
    4 b2 t# R! l/ u& v而对于其他数据类型,比如 int , short , long , float , double 等等,则不存在类似于 char 之类的情况,这些数据类型的符号位通常都是确定好的。+ S) w" y3 O2 S& u. T+ N
    基础不牢,又浪费了一个下午。 - `! j8 K6 u0 L/ }# {

    ogtpfgxnutlHurt26498340.png

    ogtpfgxnutlHurt26498340.png
    * `! R& m( d/ b; P8 i
    -END-
    1 I+ B/ ~- _3 l6 w; ]往期推荐:点击图片即可跳转阅读; P& E9 k8 X# f6 a+ G
                                                            # v* o/ X! e. E. o
                                                                    ; e/ g9 Y. d. R
                                                                           
    " j, g$ f5 t5 l- F1 v: G                                                                                2 i6 m& w. L6 S" v1 c0 M

    m5y0riwbqb464026498441.jpg

    m5y0riwbqb464026498441.jpg

    # X+ \8 u- _9 b                                                                                9 Y* p* d3 A2 _2 z
                                                                                            嵌入式 C 语言知识点,动态变长数组
    1 ~* l- c; ]" d3 r$ I                                                        & {+ U+ s6 m. X! [9 C
                                                                    / w/ l, I! o7 x
                                                                              A  T) x5 |! g+ }% J
                                                                                    , A0 }4 m) D% T

    q55ctgclb4g64026498541.jpg

    q55ctgclb4g64026498541.jpg

    ( q+ k' V. X2 L, q8 a; e, J                                                                               
    ) z( W$ D. Y! n: `# n  z                                                                                        嵌入式 C 语言特性,指定初始化器# X4 |6 e7 Q( I- u" N2 O. Z2 X
                                                                   
    & l6 n3 F4 `  W) A: X! M! B# K                                                                        4 I9 u1 s3 N7 W; Y: k( i: z; U- @
                                                                                   
    5 z! P# C2 k( B3 D

    vwq033pzdir64026498641.jpg

    vwq033pzdir64026498641.jpg

    4 |# r  V! D6 M                                                                               
    ' y6 W  |7 I5 X1 C; p                                                                                        嵌入式 C 语言知识点,掩码结构体
    5 n/ I( B# j  E! p, c& d6 R我是老温,一名热爱学习的嵌入式工程师! G7 ?" |, l8 h
    关注我,一起变得更加优秀!
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则


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