[基础知识]无符号整型范围问题,打印问题,整形的字节长度的编译器等的问题等

jackxiang 2010-10-26 22:36 | |
int类型究竟占几个字节:
最近在看深入理解计算机系统这本书,上面提到了在32位机器和64机器中int类型都占用4个字节。后来,查了The C Programming language这本书,里面有一句话是这样的:Each compiler is free to choose appropriate sizes for its own hardware, subject only to the restriction that shorts and ints are at least 16bits, longs are at least 32bits, and short is no longer than int, which is no longer than long.意思大致是编译器可以根据自身硬件来选择合适的大小,但是需要满足约束:short和int型至少为16位,long型至少为32位,并且short型长度不能超过int型,而int型不能超过long型。这即是说各个类型的变量长度是由编译器来决定的,而当前主流的编译器中一般是32位机器和64位机器中int型都是4个字节(例如,GCC)。
From: https://blog.51cto.com/charlesxie/939680


字节(Byte)是存储数据的基本单位,并且是硬件所能访问的最小单位。前面说过,CPU 只能直接处理内存数据,不能直接处理硬盘数据。硬盘数据必须先调入内存条中才可以运行。内存中存储数据的最小单位是“位(Bit)”。字节是存储数据的基本单位,位是存储数据的最小单位,不要混淆了。

内存里面存放的全是二进制代码。内存里面有很多“小格子”,每个“格子”中只能存放一个 0 或 1。一个“小格子”就是一位,所以“位”要么是 0,要么是 1,不可能有比位更小的单位。那么字节和位是什么关系呢?8 个“小格子”就是一字节,即一字节等于 8 位。
那么为什么硬件所能访问的最小单位是字节,而不是位呢?因为硬件是通过地址总线访问内存的,而地址是以字节为单位进行分配的,所以地址总线只能精确到字节。那如何控制到它的某一位呢?这个只能通过“位运算符”,即通过软件的方式来控制。

字节换算
常见的存储单位主要有bit(位)、B(字节)、KB(千字节)、MB(兆字节)、GB(千兆字节)。它们之间主要有如下换算关系:

1B=8bit
1KB=1024B
1MB=1024KB
1GB=1024MB

其中 B 是 Byte 的缩写。

https://blog.csdn.net/wydyd110/article/details/84589541


Long(长整型)变量存储为 32 位(4 个字节)有符号的数值形式,
有符号的数值形式,其范围从 -2,147,483,648 到 2,147,483,647(约为21亿)。

对32位cpu来说
整型的范围为 -2147483648~~~2147483647  这个应该对吧?
那无符号整型为:0 ~~~ 4694967295  对吧
按理说 我定义个  unsigned int aaa=2147483648;  没有越界阿  
不知道为什么得到的结果不对!!
printf("%ld\n",aaa); 得到的结果是:
-2147483648
帮忙给解释一下吧 !!


printf("%ld\n",aaa); 得到的结果是:
-2147483648
帮忙给解释一下吧 !!



这一打印就对了:

printf("%u\n",aaa);



特别注意:
程序在编译时分配内存,所以比如int型占多少内存是看编译器的,在TC2.0里,int占用2个字节,在VC6.0或WinGW是占4个字节的。其它类型的内存占用问题类似。而C-Free是一个IDE(集成开发环境),将许多的工具(比如:编译器、调试器……)集成在一起,形成一个比较方便的开发工具,其中编译器用的是WInGW,所以是占4个字节!

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/3699/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2019-9-23 17:10
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]