深入理解C语言数据类型及符号

来源:互联网 发布:数据与营销 编辑:程序博客网 时间:2024/05/22 17:45

首先,用 sizeof 求各类型字节数

这里写图片描述
这里写图片描述

看下面的例子:

这里写图片描述
这里写图片描述

为什么 sizeof(str) 是4 但是 strlen(str)是5呢? 因为看第一个例子, sizeof(str) 是求 指针字节, 而strlen(str) 是求字符串长度,所以是5.
再看:

这里写图片描述

这里写图片描述

可以看到 sizeof(str) 仍然是4 , strlen(str) 却是6. 因为字符串结束标志是字符 \0, 所以只记录了 abcdef 是6. 若把 \0 改为0 , 0就变成了一个字符, 而不是字符串结束字符 \0 这个\0 对应的是整形 0, \0显示0 的原本含义, 也就是整形0 , 字符 0 并不代表结束 .如下:

这里写图片描述

这里写图片描述

再看一个例子:

这里写图片描述
这里写图片描述

此题看上去很简单,但是鲜少有人答对.答案是255.

那么再加上一行代码看看效果:

这里写图片描述
这里写图片描述

我们来看一下a[i] 的过程:

 可以看到,    当i=0时:1111 1111  // -1的补码0000 0000  // -0的补码----------1111 1111  // -1的补码           //其原码为 1000 0001 表示 -1当i=-1时:1111 1111  // -1的补码1111 1111  // -i的补码------------  11111 1110  //最高位的1溢出, 计算机只保存 1111 1110              //其原码为 1000 0010, 表示 -2.当i=-127时:1111 1111  //-1的补码1000 0001  // -127的补码------------------11000 0000  //最高位溢出,计算机只保存 1000 0000,          //编码"100...00" 表示负整数 2^(n-1).所以它是-128 当i=-128时:1111 11111000 0000  //-128的补码------------------  10111 1111  /最高位溢出,计算机只保存 0111 1111,表示127  当i=255时,    1111 1111(1) 0000 0001   //-255的补码,最高位溢出舍去  ----------------    10000 0000  //最高位溢出,表示0 当i=256时:       1111  1111   (1) 0000  0000   -------------------       1111  1111  可以看到,当i= -255时,输出0, 对应结束字符 \0, 所以strlen(a)等于255,其后,a[i]开始循环

接下里又是一个例子:

int i = -20;unsigned int j = 10;i + j = ?

先猜猜i+j是正数还是负数?我们来看

这里写图片描述
这里写图片描述

i+j>0,为什么呢?
我们输出一下结果:
这里写图片描述
这里写图片描述

我们可以看到非常大的区别.先看一下 %d 和 %u 的区别:%d可以用在scanf中,也可以用在printf中,%u只能用在printf中(早期编译器),后来的一些编译器也可以用在scanf中。用在scanf中时二者没有区别作用与%d相同,用在printf中时二者情况就大不一样了:%d把对应的整数按有符号十进制输出,%u把对应的整数按无符号十进制输出,比如printf(“%d,%u\n”,-123,-123);,输出则是-123,4294967173——因为-123的补码是11111111111111111111111110000101,在%u控制下把它当正数输出了。

1000 ... 0001 0100 -> -20(...表示200)1111 ... 1110 1100 -> -20的补码(...表示201)

这里写图片描述

计算器算一下,然后再加上10,就是 %u的结果
看一下我们老师留的作业:

unsigned int a = 3;unsigned int j;j = a * (-1);求j;

一样的道理,在计算机中这样运行 :

    1111 ... 1111 -> -1的补码,共321,两数相乘    0000 ... 0011 -> 3的二进制码,共32位  ----------------------    1111 ... 1111   1111 ... 1111   ----------------------  101111... 11101  最高位溢出,在计算机上保留 01111...11101 其中...表示1,总共32

计算器上看一下结果
这里写图片描述

哎呦,果然一样,这就是正确的结果,再看一下我的程序:

这里写图片描述
这里写图片描述

哎呦,和计算器上一样哦.暂时就这麽多吧,好累呀…加油 !!!