鱼C论坛

 找回密码
 立即注册
查看: 637|回复: 12

[已解决]关于一些C的基本类型值的疑惑

[复制链接]
发表于 2020-7-10 21:14:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
用的centos系统
  1. [root@izwz92o83jsu6x277ey7lzz SE2]# cat /etc/centos-release
  2. CentOS Linux release 7.7.1908 (Core)
  3. [root@izwz92o83jsu6x277ey7lzz SE2]# uname -r
  4. 3.10.0-1062.12.1.el7.x86_64
  5. [root@izwz92o83jsu6x277ey7lzz SE2]# getconf LONG_BIT
  6. 64
复制代码


C的代码
  1. #include <stdio.h>



  2. int main(void){

  3.     int a=2147483647;
  4.     printf("INT  takes %lu  bytes!\nInteger max value is %d ,",sizeof(a), a);
  5.     a = a + 1;
  6.     printf("After adding 1 "a" value is %d\n\n",a);
  7.    
  8.     short b=32767;
  9.     printf("Short takes %lu bytes!\n Short max value is %d,", sizeof(b), b);
  10.     b = b + 1;
  11.     printf("After adding 1 "b" value is %d\n\n", b);

  12.    
  13.     long c = 2147483647;
  14.     printf("Long int  takes %lu  bytes!\nLont Integer max value is %d ,",sizeof(c), c);
  15.     c = c + 1;
  16.     printf("After adding 1 "c" value is %d\n\n",c);

  17.     unsigned long d = 2147483646 * 2 - 1;
  18.     printf("Unsigned Long int  takes %lu  bytes!\nUngigned Long Integer max value is %d ,",sizeof(d), d);
  19.     d = d + 1;
  20.     printf("After adding 1 "d" value is %d\n\n",d);

  21.     unsigned e = 2147483647;
  22.     printf("Unsigned int  takes %lu  bytes!\nUnsigned Integer max value is %d ,",sizeof(e), e);
  23.     e = e +1;
  24.     printf("After adding 1 "e" value is %d\n\n",e);
  25.    
  26.     long long f=5;
  27.     printf("Long long  int  takes %lu  bytes!\nLong long Integer max value is %d ,",sizeof(f), e);
  28.     f = f +1;
  29.     printf("After adding 1 "e" value is %d\n\n",f);

  30.     return 0;
  31. }
复制代码


运行结果:
  1. INT  takes 4  bytes!
  2. Integer max value is 2147483647 ,After adding 1 "a" value is -2147483648

  3. Short takes 2 bytes!
  4. Short max value is 32767,After adding 1 "b" value is -32768

  5. Long int  takes 8  bytes!
  6. Lont Integer max value is 2147483647 ,After adding 1 "c" value is -2147483648

  7. Unsigned Long int  takes 8  bytes!
  8. Ungigned Long Integer max value is -5 ,After adding 1 "d" value is -4

  9. Unsigned int  takes 4  bytes!
  10. Unsigned Integer max value is 2147483647 ,After adding 1 "e" value is -2147483648

  11. Long long  int  takes 8  bytes!
  12. Long long Integer max value is -2147483648 ,After adding 1 "e" value is 6
复制代码


问题1: long不是 4 byte 吗?为什么打印是8 byte,是什么原因导致的。
问题2: 8 byte的最大最小值为什么也是-2147483648 ~ 2147483647, 和 4 byte的int一模一样。
问题3 : unsigned 的最小值不应该是0吗?最大值应该是 2^32, 情况也不对呀,为什么?
最佳答案
2020-7-10 22:11:30
本帖最后由 永恒的蓝色梦想 于 2020-7-10 22:12 编辑
问题1: long不是 4 byte 吗?为什么打印是8 byte,是什么原因导致的。
有些机器 long 就是 64bit 。建议不要使用 long,用 int 和 long long 代替。

问题2: 8 byte的最大最小值为什么也是-2147483648 ~ 2147483647, 和 4 byte的int一模一样。
Lont Integer max value is 2147483647 ,After adding 1 "c" value is -2147483648
  1.     long c = 2147483647;
  2.     printf("Long int  takes %lu  bytes!\nLont Integer max value is %d ,",sizeof(c), c);
  3.     c = c + 1;
  4.     printf("After adding 1 "c" value is %d\n\n",c);
复制代码
8bit 整形用 %d 格式化发生截断,前 4bit 数据丢失,所以出现这样的结果。

问题3 : unsigned 的最小值不应该是0吗?最大值应该是 2^32, 情况也不对呀,为什么?
Unsigned int  takes 4  bytes!
Unsigned Integer max value is 2147483647 ,After adding 1 "e" value is -2147483648
  1.     unsigned e = 2147483647;
  2.     printf("Unsigned int  takes %lu  bytes!\nUnsigned Integer max value is %d ,",sizeof(e), e);
  3.     e = e +1;
  4.     printf("After adding 1 "e" value is %d\n\n",e);
复制代码
int 型的 -2147483648 和 unsigned 型的 2147483648 在内存中表示是完全一样的。在这里,你使用 %d 格式化,所以是按 int 来输出。

你是在考我们吗?

满意请选最佳哦~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-10 21:16:33 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-7-10 22:02:36 | 显示全部楼层
格式化操作符用错了。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-10 22:11:30 | 显示全部楼层    本楼为最佳答案   
本帖最后由 永恒的蓝色梦想 于 2020-7-10 22:12 编辑
问题1: long不是 4 byte 吗?为什么打印是8 byte,是什么原因导致的。
有些机器 long 就是 64bit 。建议不要使用 long,用 int 和 long long 代替。

问题2: 8 byte的最大最小值为什么也是-2147483648 ~ 2147483647, 和 4 byte的int一模一样。
Lont Integer max value is 2147483647 ,After adding 1 "c" value is -2147483648
  1.     long c = 2147483647;
  2.     printf("Long int  takes %lu  bytes!\nLont Integer max value is %d ,",sizeof(c), c);
  3.     c = c + 1;
  4.     printf("After adding 1 "c" value is %d\n\n",c);
复制代码
8bit 整形用 %d 格式化发生截断,前 4bit 数据丢失,所以出现这样的结果。

问题3 : unsigned 的最小值不应该是0吗?最大值应该是 2^32, 情况也不对呀,为什么?
Unsigned int  takes 4  bytes!
Unsigned Integer max value is 2147483647 ,After adding 1 "e" value is -2147483648
  1.     unsigned e = 2147483647;
  2.     printf("Unsigned int  takes %lu  bytes!\nUnsigned Integer max value is %d ,",sizeof(e), e);
  3.     e = e +1;
  4.     printf("After adding 1 "e" value is %d\n\n",e);
复制代码
int 型的 -2147483648 和 unsigned 型的 2147483648 在内存中表示是完全一样的。在这里,你使用 %d 格式化,所以是按 int 来输出。

你是在考我们吗?

满意请选最佳哦~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-10 22:14:51 | 显示全部楼层
顺便问一下,你字符串中都没转义,怎么过的编译?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-10 22:19:46 | 显示全部楼层
Hello. 发表于 2020-7-10 21:16
https://blog.csdn.net/frank0712105003/article/details/8044903

我感觉你并没有看问题,而只是复制了个链接
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-11 02:12:40 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-7-10 22:14
顺便问一下,你字符串中都没转义,怎么过的编译?

你是说这段吗?代码cpoy过来变了,能编译过,肯定没问题的!

Python用管了,不知道C格式化的时候,分数据来

int -> %d
long -> %ld
long long ->%lld
char -> %s
unsigned ->%u

五花八门的格式化输出~


  1. printf("After adding 1 "d" value is %d\n\n",d);
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-11 07:15:54 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-7-11 08:40 编辑
Stubborn 发表于 2020-7-11 02:12
你是说这段吗?代码cpoy过来变了,能编译过,肯定没问题的!

Python用管了,不知道C格式化的时候,分 ...


这代码不可能过编译

你用 cout 就不会出这种问题了……

纠正,应该是:
char -> %c
char* -> %s
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-11 11:19:49 | 显示全部楼层
本帖最后由 Stubborn 于 2020-7-11 11:20 编辑
永恒的蓝色梦想 发表于 2020-7-11 07:15
这代码不可能过编译

你用 cout 就不会出这种问题了……

纠正,应该是:


\"a\" 这里斜巷被转义了,代码里面有的

  1. [root@izwz92o83jsu6x277ey7lzz SE2]# cat se3.c
  2. #include <stdio.h>



  3. int main(void){

  4.     int a=2147483647;
  5.     printf("INT  takes %lu  bytes!\nInteger max value is %d ,",sizeof(a), a);
  6.     a = a + 1;
  7.     printf("After adding 1 "a" value is %d\n\n",a);
  8.    
  9.     short b=32767;
  10.     printf("Short takes %lu bytes!\n Short max value is %d,", sizeof(b), b);
  11.     b = b + 1;
  12.     printf("After adding 1 "b" value is %d\n\n", b);

  13.    
  14.     long c = 2147483647;
  15.     printf("Long int  takes %lu  bytes!\nLont Integer max value is %ld ,",sizeof(c), c);
  16.     c = c + 1;
  17.     printf("After adding 1 "c" value is %ld\n\n",c);

  18.     unsigned long d = 2147483646 * 2;
  19.     printf("Unsigned Long int  takes %lu  bytes!\nUngigned Long Integer max value is %u ,",sizeof(d), d);
  20.     d = d + 1;
  21.     printf("After adding 1 "d" value is %u\n\n",d);

  22.     unsigned e = 2147483647;
  23.     printf("Unsigned int  takes %lu  bytes!\nUnsigned Integer max value is %u ,",sizeof(e), e);
  24.     e = e +1;
  25.     printf("After adding 1 "e" value is %u\n\n",e);
  26.    
  27.     long long f=5;
  28.     printf("Long long  int  takes %lu  bytes!\nLong long Integer max value is %lld ,",sizeof(f), e);
  29.     f = f +1;
  30.     printf("After adding 1 "e" value is %lld\n\n",f);

  31.     return 0;
  32. }





  33. [root@izwz92o83jsu6x277ey7lzz SE2]# gcc se3.c -o se && ./se
  34. se3.c: In function ‘main’:
  35. se3.c:23:34: warning: integer overflow in expression [-Woverflow]
  36.      unsigned long d = 2147483646 * 2;
  37.                                   ^
  38. INT  takes 4  bytes!
  39. Integer max value is 2147483647 ,After adding 1 "a" value is -2147483648

  40. Short takes 2 bytes!
  41. Short max value is 32767,After adding 1 "b" value is -32768

  42. Long int  takes 8  bytes!
  43. Lont Integer max value is 2147483647 ,After adding 1 "c" value is 2147483648

  44. Unsigned Long int  takes 8  bytes!
  45. Ungigned Long Integer max value is 4294967292 ,After adding 1 "d" value is 4294967293

  46. Unsigned int  takes 4  bytes!
  47. Unsigned Integer max value is 2147483647 ,After adding 1 "e" value is 2147483648

  48. Long long  int  takes 8  bytes!
  49. Long long Integer max value is 2147483648 ,After adding 1 "e" value is 6

  50. [root@izwz92o83jsu6x277ey7lzz SE2]#
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-11 16:12:40 | 显示全部楼层
Stubborn 发表于 2020-7-11 11:19
\"a\" 这里斜巷被转义了,代码里面有的


巧了,你的代码里看不见

\"\"
  1. ""
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-11 18:09:57 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-7-11 16:12
巧了,你的代码里看不见

\"\"

复制过来被转义了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-11 18:10:29 | 显示全部楼层
Stubborn 发表于 2020-7-11 18:09
复制过来被转义了。

论坛的 BUG

你在线啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-11 18:11:25 | 显示全部楼层
Stubborn 发表于 2020-7-11 18:09
复制过来被转义了。

其实你用 C++,完全不会出这种问题
只要你不特别注重效率
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 20:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表