今天看到一个视频关于其51单片机流水灯到达边界时消失的问题。
代码乍一看是没有什么问题的,那么是什么导致了这个问题呢? 在解决这个问题之前和大家将一个游戏界里的趣事。
在早期《文明》游戏中每一位领导人都有对应的侵略指数,而印度甘地作为以“非暴力,不合作”闻名的领袖其侵略程度被设置为了1,而当甘地采用民主政体的时候,其侵略指数-2就变成了-1,但是游戏对于侵略指数是一个无符号类型的,
侵略指数变成了255 ,于是甘地就开始满世界丢核弹。当然这也就是一个梗,不知道其真实性,但是视频中出现的问题和《文明》一样。
在于其定义的一个unsigned char类型的变量,画蛇添足的添加了unsigned前缀修饰。
众所周知一个8位的数据类型可以代表255个数据,而为了囊括负数,将类型的 首位用作符号位
,即首位的0还是1代表符号正负,那么char类型所能代表的数据范围是-128~127.
而unsigned的左右就是修饰类型,使其成为 无符号数 ,扩大其表示范围,例如unsigned char 的表示范围是0~255.
同理,int的数据范围是-2^15~(2^15-1)也就是常见的那个-32768~32767,而unsigned
int的数据范围是0~2^16也就是0~65532。
于是上述视频的问题在于它定义的无符号数count,代码其他并没有什么问题,最大的问题在于其修饰符号unsigned,这样子count为0时再减一可不是-1,而是255也就是0xFF,即便是代码其他都没有错误,也无法达到效果甚至有时候起到反作用。
学习之时务必细心,尤其是这些基础内容,若是囫囵吞枣跳过,那么即便抄对了代码也是一知半解,错误许多。