电子产业一站式赋能平台

PCB联盟网

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

被 char 类型的变量坑惨了!

[复制链接]

572

主题

572

帖子

4361

积分

四级会员

Rank: 4

积分
4361
发表于 2024-7-31 17:50:00 | 显示全部楼层 |阅读模式
我是老温,一名热爱学习的嵌入式工程师
3 t! ?  Y8 i& N( B% K, m关注我,一起变得更加优秀!
* J  l; A) `7 G3 m& _" z  x情况是这样的,我之前在开发一个物联网产品的时候,这款产品里面有涉及到温度数据的采集,需要把环境温度上报到服务器,然后同步到其他终端进行显示。7 e' D& ^! @/ f0 b
然后我心里面想,通常环境温度一般在负几十度到正几十度的区间,采用 char 类型的变量,其取值范围在 -127 ~ 127,一般都是足够的。% D) I8 H9 J; I( _4 G5 X4 Q0 ~
(原谅我的不严谨,对于整型值,一般建议用 int,为了省字节空间,所以用了char 类型)
( V1 b& N. \; q# O8 m; ~# T! }8 r0 P. p3 }# j% O
于是,我通常会写出类似以下的代码:
  • int update_temperature(void){    char temp_value = 0;        temp_value = get_temperature_value();    //获取温度值      update_to_cloud(temp_value);    //上传到云端}
    ! Z# S% l! q5 x- ]5 F; e上述代码,采集完温度之后用char类型的变量保存起来,然后上传到云端服务器里面。
    7 U$ d6 Y5 e; |在进行低温环境(-10℃)测试的时候,我发现了一种非常奇怪的现象,其他终端里面显示的温度值,居然是246摄氏度,好家伙,直接就收到了温度过高的告警信息。# I, {# v8 U+ x5 u7 D6 m7 m" Y% X2 o- S

    phuhton4m2hBroken5410817.png

    phuhton4m2hBroken5410817.png

    + p8 j: W6 E6 F( e百思不得其解,我明明用 char 类型的变量去定义一个温度值,并且也没有超过无符号数的取值范围,按理来说应该是正确的才对。
    / _9 \. U) a. b. f! G+ d而且这现象有一个规律,当温度是-10时,显示246,当温度是-20时,显示236,这些现象的绝对值相加,等于256。# i' ~# Z$ j2 L2 m/ d9 J  V8 J
    我突然意识到,关于 char 类型变量的取值范围,应该有一些知识点是我还没有了解清楚的。~% B( Q9 v7 t- h
    网上一搜 “c 语言 char 类型变量的取值范围”,果然,答案马上就出来了。! p% `9 m4 p3 H! g& J$ }1 {% V: E

    pn5ohnw4to16405410917.jpg

    pn5ohnw4to16405410917.jpg

    1 g' l- t6 W1 v9 k  v3 y对于 char 类型定义的变量是有符号数还是无符号数,其实是由编译器和平台来指定的,也就是说,当我们直接用 char 来定义变量的时候,它有可能是一个无符号数。
    $ j+ F1 }* K2 ]1 P就是因为我当时用的编译器和平台,把 char 类型的变量指定为无符号类型了,当我对一个无符号类型的变量赋予一个负数值的时候,问题就出现了。2 K, k. _" B7 u- H+ h. J8 z2 g2 v
    看了一下 MDK 编译器里面的选项,可以强制指定 char 类型的变量为有符号类型,对于 GCC编译器,可以使用 -fsigned-char 选项。
    1 M. J7 Z. y6 k. Y& p

    52dahsd3cih6405411017.jpg

    52dahsd3cih6405411017.jpg
    ) [9 k& p' ^7 _* a3 k! f
    但是,为了代码有比较好的可移植性,一般建议我们对字符变量进行显式定义,比如:有符号使用 signed char 进行定义,无符号使用 unsigned char 进行定义" J8 V1 B" F' w1 ?% `
    而对于其他数据类型,比如 int , short , long , float , double 等等,则不存在类似于 char 之类的情况,这些数据类型的符号位通常都是确定好的。
    & _; n. s' w4 k/ q- w& u基础不牢,又浪费了一个下午。
    5 X  p9 X; |! J7 O" E5 w6 ~- ]

    vkixq2cgk2iHurt5411118.png

    vkixq2cgk2iHurt5411118.png
    / s1 o1 W, X3 g0 q
    -END-
    3 ^9 L- }$ |6 n5 g% }# q( k往期推荐:点击图片即可跳转阅读
    0 J+ ^3 `; U% a! q' R                                                       
    9 z, Z- e3 p6 a  A, d8 e                                                                $ Q' w* q% X! f7 K$ s
                                                                           
    ! o: k7 R. D) u5 v4 v, d                                                                               
      z( Z# @1 p) m/ H- F* h) @0 w5 o

    gjjf3fqijxj6405411218.jpg

    gjjf3fqijxj6405411218.jpg

    * r9 S1 X0 D3 p# q( I* y                                                                               
    ' s/ e/ B8 S+ t                                                                                        嵌入式 C 语言知识点,动态变长数组
    3 A* R7 T% n# }/ u+ J9 @4 p8 h                                                       
    7 s5 c8 s. o0 W6 r  `  q                                                               
    " p1 b( `6 p6 w+ i7 k                                                                        ; I- I% Q( g( j& X8 }3 |
                                                                                    5 Q$ W7 `) n3 c$ F. B6 A

    s0yzlq2lezr6405411318.jpg

    s0yzlq2lezr6405411318.jpg

    % d9 a( R% k6 h7 i- a6 H( ?                                                                               
    / K( S0 N; U' F/ o$ ~, x9 ]                                                                                        嵌入式 C 语言特性,指定初始化器4 {( T3 i5 ]; F/ A9 t
                                                                   
    , q9 n. {" I4 h. G                                                                       
    # W" x. C; n! v( J7 {                                                                               
    6 i5 Z+ o) M- ^

    5x3amzbm1ex6405411418.jpg

    5x3amzbm1ex6405411418.jpg
    : z, [& n% I9 ^( ]5 S9 D& u7 |
                                                                                   
      q/ Q1 V% i5 I6 }$ I4 g                                                                                        嵌入式 C 语言知识点,掩码结构体
    ! _# |6 G. q: M. T2 L( T我是老温,一名热爱学习的嵌入式工程师
    # Z" F' H8 c$ @5 d5 c关注我,一起变得更加优秀!
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则


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