64位Linux上,int仍然是整型32位?

maogou4260 2012-08-20 03:21:23
x86_64的Linux:

int main(void) {
int foo
scanf("%i", &foo)
printf("%i", foo)
return 0
}


输入2147483648后就溢出了,查阅了/usr/include/limits.h,发现:

/* Minimum and maximum values a `signed int' can hold.  */                  
# define INT_MIN (-INT_MAX - 1)
# define INT_MAX 2147483647


也就是说;int永远是整型32位?那64的整型用什么数据类型?
...全文
1362 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
vaglab 2015-02-05
  • 打赏
  • 举报
回复
引用 12 楼 maogou4260 的回复:
明白了,总结以下: 1.int位数和编译器相关,但一定大于short,至少16位。通常在32/64位平台都采用32位; 2.64位long是8字节,而32位需要用long long。64位的long long仍旧是8字节,为了兼容32位设计的。 3.可靠的是用stdint.h的int64_t。标准库保证在你的平台上,这个一定是给定位数的。
我看到的是32位和64位上int 32位,long和long long 64位,是一样的,可能是内部实现不一样吧,位数是一样的
maogou4260 2012-08-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
[/Quote]

回帖说的我已经试验过了,确实如此。
赵4老师 2012-08-21
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
maogou4260 2012-08-21
  • 打赏
  • 举报
回复
明白了,总结以下:

1.int位数和编译器相关,但一定大于short,至少16位。通常在32/64位平台都采用32位;
2.64位long是8字节,而32位需要用long long。64位的long long仍旧是8字节,为了兼容32位设计的。
3.可靠的是用stdint.h的int64_t。标准库保证在你的平台上,这个一定是给定位数的。
AnYidan 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
这个和编译器有关
[/Quote]

++
jiandingzhe 2012-08-21
  • 打赏
  • 举报
回复
今天发现stdint.h还有很多有意思的东西,比如intptr_t、uintptr_t保证能塞个指针进去,int_fastXX_t和uint_fastXX_t保证给你一个能塞下XX位、同时是字长对齐的类型。
smsgreenlife 2012-08-20
  • 打赏
  • 举报
回复
这个和编译器有关
hitcser01 2012-08-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

这个问题和具体的编译器有关,不同的编译器采用不同的整数模型。不过目前为了兼容性,普遍都是int为32位,这样移植方便。
[/Quote]也这么认为。
辰岡墨竹 2012-08-20
  • 打赏
  • 举报
回复
这个问题和具体的编译器有关,不同的编译器采用不同的整数模型。不过目前为了兼容性,普遍都是int为32位,这样移植方便。
wzh0413 2012-08-20
  • 打赏
  • 举报
回复
这是个范围的问题,我觉得该看一看,有关这方面的书
qq120848369 2012-08-20
  • 打赏
  • 举报
回复
64位long是8字节,而32位需要用long long,当然64位的long long仍旧是8字节,为了兼容32位设计的。

int在两者都是4字节。
jiandingzhe 2012-08-20
  • 打赏
  • 举报
回复
可靠的是用stdint.h的int64_t。标准库保证在你的平台上,这个一定是给定位数的。
icemornings 2012-08-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

这个要看编译器,gcc似乎是int是4位,void*是8位的,64位的大概是long long
[/Quote]
64位系统的指针肯定是64位的,地址线是64位的

用long long 型是保险的,因为C标准规定long long型的最小取值范围是
-9223372036854775807~9223372036854775807
而int型的最小取值范围是-32767~32767,也就是说int型用16位来表示也是符合标准的……
BYD123 2012-08-20
  • 打赏
  • 举报
回复
1)int 只会保证比short类型字节数多于后者相等;
2)想要确保用64的整型,可靠地方法是用long long;
nice_cxf 2012-08-20
  • 打赏
  • 举报
回复
这个要看编译器,gcc似乎是int是4位,void*是8位的,64位的大概是long long
icemornings 2012-08-20
  • 打赏
  • 举报
回复
long型或者C99的long long型

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧