问题描述
- c++ 的 printf函数的输出问题
-
假设在一个 32 位 little endian 的机器上运行下面的程序,结果是多少?int main(){ long long a = 1, b = 2, c = 3 printf("%d %d %d ", a, b, c); return 0; }
A 1,2,3
B 1,0,2
C 1,3,2
D 3,2,1
解决方案
printf 函数问题
C语言中printf格式化输出函数
C语言中printf格式化输出函数
解决方案二:
应该也是123吧,感觉和little endian没关。
解决方案三:
这个还是1,2,3
跟大小端没多大关系
解决方案四:
低端 和 高端 字节序 是cup不同 处理数值的内存位置不一样 你在低端上运行程序 数值不会有什么改变的 除非你把低端的字节序 发送给 高字节序的机器去处理相同的内存时候 才会有不同的差别
解决方案五:
低端 和 高端 字节序 是cup不同 处理数值的内存位置不一样 你在低端上运行程序 数值不会有什么改变的 除非你把低端的字节序 发送给 高字节序的机器去处理相同的内存时候 才会有不同的差别
解决方案六:
B 1,0,2 B 1,0,2 B 1,0,2 B 1,0,2 B 1,0,2
解决方案七:
答案应该是B。
a, b, c各占8字节,因此调用printf()时的压栈顺序(按照32位来考虑):字符串,LOW(a), HI(a), LOW(b), HI(b), LOW(c), HI(c)。
LOW(a)为a的低4字节(=1),HI(a)为a的高4字节(=0)。其余同理。先压LOW(a)还是先压HI(a)由系统架构,即little endian决定。
先压a,还是先压c是由调用约定决定。这里可以暂不考虑调用约定,因为出栈和入栈是保持一致的。
printf的读取参数的时候,因为一个%d处理一个整型(4字节)参数,所以第一个%d对应LOW(a)=1, 第二个%d对应HI(a)=0,第三个%d对应LOW(b)=2。
时间: 2024-10-21 13:08:18