linux下C编程(五)之unsigned 的大坑货和 char 和浮点数

       说起unsigned,这个还是听起来不错的,无符号。 unsigned char  a;   她的范围是( 0~255),如果是char a;那么她的范围是(-128 ~+127),一会再说为什么当是char的时候范围是(-128 ~+127)。先说很坑的unsigned, 我们一般知道

0 -1 =-1,这个无可质疑,但是如果你定义的是unsigned,那么0-1=255,对,你没有看错。也许有人会说,注意一下,但是在程序中不注意,一定会出现错误,比如说,看下面:

    

#include <stdio.h>
#include <string.h>

int comp_len(const char *str1,const char *str2);

int comp_len(const char *str1,const char *str2)
{
    //return strlen(str1) - strlen(str2) > 0;
   
    //size_t strlen(const char *s); 返回值是一个无符号型

    return strlen(str1) > strlen(str2);
}

int main(int argc ,char *argv[])
{
    char *str1 = "tongtong";
    char *str2 = "du shuai xi huan gup ni";
    
     comp_len(str1,str2);
    return 0;
}
   

return strlen(str1) > strlen(str2);这种写法是正确的,而return strlen(str1) - strlen(str2) > 0;确实错误的,理由已经说过,不论谁减去谁都是正值。因为范围就是0-255,所以一定要把类型看清楚。


为什么当是char的时候范围是(-128 ~+127)

          -0 :原码 1000 0000 的补码为1 0000 0000 ,由于char 是 八位 ,所以取低八位00000000,   +0 :原码为0000 00000 ,补码为也为 0000 0000 ,虽然补码0都是相同的,但是有两个0 ,既然有两个0 ,况且0既不是正数,也不是负数, 用原码为0000 0000 表示就行了, 这样一来,有符号的char ,原码都用来表示-127~127 之间的数了,唯独剩下原码1000 0000 没有用,有人说-0即1000 0000 与128的补码相同,所以用1000 0000表示-128, 1 1000 0000,这是-128的补码,发现和原码一样, 1 1000 0000和1000 0000 相同?如果说一样的人真是瞎了眼了,所以,-128的原码和-0(1000 000)的原码是不同的,但是在char 型中,是可以用1000 000 表示-128的,关键在于char 是8位,它把-128的最高位符号位1 丢弃了,截断后-128的原码为1000 000 和-0的原码相同,也就是说1000 0000  和-128丢弃最高位后余下的8位相同,所以才可以用-0 表示-128,这样,当初剩余的-0(1000 0000),被拿来表示截断后的-128,因为即使截断后的-128和char 型范围的其他数(-127~127)运算也不会影响结果, 所以才敢这么表示-128。



浮点数的存储规则


sef
1823


规则如下:

   1.左起第一位符号位,正数为0,负数为1

   2 指数位 指数(e)在这里还有一个规则: 实际储存 = e+127; 这是为了协调指数的正负.

   3 尾数位


0x12345678 


大端机器:数值上的高位放在内存上的低位

     78563412

小端机器:数值上的高位放在内存上的高位

    12345678


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值