4 ms·
Long is 32 bits on x86, 64 bits on x86_64. x86 code bases broke because they made non-portable assumptions.
by klodolph 4y ago
Long is 32 bits on x86, 64 bits on x86_64. x86 code bases broke because they made non-portable assumptions.
- kevin_thibedeau 4y agoNo. It's 32-bits minimum. It can be anything larger. That's what the language says. Assuming otherwise is nonportable.
- deleted 4y ago[deleted]
- klodolph 4y agoWhy are you saying “no” and then agreeing with what I wrote? Am I misunderstanding something?
- TylerE 4y agoBecause "32 bits or greater" != "exactly 32 bits"
- klodolph 4y agoRight. One is what the C standard says, and the other is what the ABI standard says. Maybe I’m missing something here. Obviously, when someone says “type X is size Y on architecture Z”, they’re not talking about the C standard, they’re talking about some particular ABI.
- thayne 4y ago> the other is what the ABI standard says There are multiple ABIs for x86_64. I think the major compilers use 32 bits for int and 64 for long, but there could very well be a compiler that used different sizes, with a different ABI.
- jcelerier 4y agoYep, the x32 ABI on Linux is based on the amd64 instruction set, registers, etc. but uses 32-bit long and pointers (which in my experience is a nice performance boost, I measured up to 20% in some cases)
- kevin_thibedeau 4y agoBecause it isn't "64-bits on x64". It's 32-bit minimum on all platforms. Assuming larger sizes than the minimum is how brittle code gets written. A compiler vendor can set the sizes to whatever they want regardless of the target architecture and claim conformance if they meet the minimum.
- klodolph 4y agoTalking about the SysV ABI. There are multiple standards involved, not just the language standard itself. > A compiler vendor can set the sizes to whatever they want regardless of the target architecture and claim conformance if they meet the minimum. Compilers claim conformance with other standards besides just the C standard.
- bjourne 4y agoYou are confusing ABIs with what the C standards mandate. A compiler emitting code for a particular architecture need to conform to that architecture's ABI. Or else it won't be able to interface with syscalls or other libraries. This goes for other things too like calling conventions and setup of stack frames. As klodolph states, long is 64 bit on x86_64, (32 on x86_64-win) and 32 on x86.