深入理解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(...表示20个0)1111 ... 1110 1100 -> -20的补码(...表示20个1)
计算器算一下,然后再加上10,就是 %u的结果
看一下我们老师留的作业:
unsigned int a = 3;unsigned int j;j = a * (-1);求j;
一样的道理,在计算机中这样运行 :
1111 ... 1111 -> -1的补码,共32个1,两数相乘 0000 ... 0011 -> 3的二进制码,共32位 ---------------------- 1111 ... 1111 1111 ... 1111 ---------------------- 101111... 11101 最高位溢出,在计算机上保留 01111...11101 其中...表示1,总共32位
计算器上看一下结果
哎呦,果然一样,这就是正确的结果,再看一下我的程序:
哎呦,和计算器上一样哦.暂时就这麽多吧,好累呀…加油 !!!
- 深入理解C语言数据类型及符号
- C语言的强符号和弱符号深入理解
- 深入理解C语言-----各数据类型大小
- 深入理解C语言-----各数据类型大小
- 深入理解sizeof+C语言数据类型+内存补齐
- 深入理解sizeof+C语言数据类型+内存补齐
- 深入理解sizeof+C语言数据类型+内存补齐
- 深入理解计算机系统学习之C语言中有符号与无符号数的转换
- 深入理解C语言
- 深入理解 c语言
- 深入理解C语言
- 深入理解C语言
- 深入理解C语言
- 深入理解c语言
- 深入理解C语言
- 深入理解C语言
- 深入理解C语言
- 深入理解C语言
- Mybatis初窥:使用resultMap自定义高级映射规则
- Mac安装nvm后:--nvm command not found
- Python常用函数总结
- C#之DataSet和DataTable
- C语言 java 整数逆序,回文数判断
- 深入理解C语言数据类型及符号
- yum 源制作
- C语言回文数判断,结果写入文件中
- CentOs7安装Shadowsocks
- 基础知识 java 图片与string相互转换
- 2017年国庆随笔----- 心理学随笔
- platform设备驱动组织方式
- JAVA自带的加密算法-MD5\SHA1\BASE64
- ambari 的注意点