C调用规则中unsigned long long类型压栈问题

芝士架构 APP 凯恩 2011-08-13 07:19:54
请问大家,会被截断么。
...全文
107 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 supermegaboy 的回复:]

只有C99才有long long,C99既然支持long long,符合C99的编译器在实参入栈时必然对其提供支持,因此不可能发生截断的问题,除非这个编译器的设计者是SB。
[/Quote]
呵呵,说的很直接。不过通过实验我发现gcc编译器虽然支持long long(至少编译没报错),但在对其进行压栈处理时针对参数的大小采取了不同的入栈方式。
对于小于32位的数据它将其入栈一次,但是高位未用零填充并入栈。
对于大于32位数据,它先将高32位入栈在入栈低32位。
但在函数体内使用该类型参数时却将低32位在栈中起始的两个字节(64位)作为该类型参数的值。这样的就会导致一个bug:一旦向该函数传入一个32位大小的long long类型的值A,并且后面紧跟任意类型参数B,就会导致在函数中无法B的正确值,因为B的值被当作A的一部分被接受了。不知道这是不是编译器使用的问题。因为我没有向这个http://topic.csdn.net/u/20110118/12/7f829151-c80b-4ee8-bb4a-1da31799e1ed.html中一样指定参数-std=c99。我使用的编译器是gcc (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5

luciferisnotsatan 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 supermegaboy 的回复:]

只有C99才有long long,C99既然支持long long,符合C99的编译器在实参入栈时必然对其提供支持,因此不可能发生截断的问题,除非这个编译器的设计者是SB。
[/Quote]
++
AnYidan 2011-08-13
  • 打赏
  • 举报
回复
具体实现,并不是每个 compiler 都 100% 遵守标准的
东莞某某某 2011-08-13
  • 打赏
  • 举报
回复
这要看编译器是否支持了
gsy999 2011-08-13
  • 打赏
  • 举报
回复
我知道,Win32位汇编语言编程压栈指令push的操作数是4个字节,你不可能把超过4个字节的数据压栈。遇到大尺寸数据怎么办?可以用指针啊。
飞天御剑流 2011-08-13
  • 打赏
  • 举报
回复
只有C99才有long long,C99既然支持long long,符合C99的编译器在实参入栈时必然对其提供支持,因此不可能发生截断的问题,除非这个编译器的设计者是SB。
無_1024 2011-08-13
  • 打赏
  • 举报
回复
不知道 只知道在C++里面最大的也就是__int64

69,382

社区成员

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

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