我写了这个小代码:
#include <stdio.h>
int main() {
    size_t temp;
    temp = 100;

    printf("lld=%lld,ld=%ld,u=%u\n",temp,temp);

    return 0;
}

我在一个带有gcc版本4.1.1 20070105(Red Hat 4.1.1-52)的i386 GNU / Linux机器上运行.这是我得到的输出:

lld=429496729700,ld=100,u=7993461

我可以理解,第一个(lld)被打印为垃圾,因为当可变temp只有4个字节时,printf尝试打印8个字节(由lld表示的long long).
但是,我不明白为什么最后一个标识符u被打印为垃圾,而在我看来,这是size_t最接近的适用标识符.

这里我假设size_t是unsigned int(我的i386有4个字节).

现在我用printf线做了一点调整:

...
printf("ld=%ld,u=%u,lld=%lld\n",temp);
...

我有一个非常好的答案(除了lld部分).

ld=100,u=100,lld=34331653576851556

有人可以帮我理解我在这里错过什么吗?

非常感谢任何帮助!

[注意:我尝试使用gcc -O [0,2]标签打开/关闭切换优化,观察结果没有任何差异.]

解决方法

这是因为您在堆栈中推送的是三个32位值,格式字符串尝试使用其中的四个值,或者更精确地使用一个64位值和两个32位值.

在第一种情况下,lld吸收了两个32位值,ld吸收了第三个值,并且在这之后,你会发现任何事情发生在堆栈上,这真的是任何事情.

当您更改字符串中格式说明符的顺序时,它的作用不同,因为ld吸收了第一个32位值,您吸收了第二个,而lld吸收了第三个加上任何恰好在堆栈上的事情.那.这就是为什么你得到不同的值,这是一个数据对齐/可用性问题.

您可以使用第一个值查看此操作. 429496729700等于(4294967296 1)* 100,即(232 1)* 100.你的代码段

printf("lld=%lld,temp);

实际上有以下效果:

What you pass     Stack     What printf() uses
-------------     -----     ------------------
                 +-----+
100              | 100 | \
                 +-----+  = 64-bit value for %lld.
100              | 100 | /
                 +-----+
100              | 100 |    32-bit value for %ld.
                 +-----+
                 | ?   |    32-bit value for %u (Could be anything).
                 +-----+

在第二种情况下

printf("ld=%ld,temp);

发生以下情况:

What you pass     Stack     What printf() uses
-------------     -----     ------------------
                 +-----+
100              | 100 |    32-bit value for %ld.
                 +-----+
100              | 100 |    32-bit value for %u.
                 +-----+
100              | 100 | \
                 +-----+  = 64-bit value for %lld (Could be anything).
                 | ?   | /
                 +-----+

具有lld,ld和d类型标识符的size_t变量的c – printf的更多相关文章

  1. 使用最新的Flurry SDK和ios4重新启动应用程序

    我真的希望这对我来说只是一个愚蠢的错误.我很高兴使用Flurry但这样的事情会导致我的应用被拒绝.解决方法我写了关于这个的Flurry,他们很快回到我身边,他们会调查这个.大约一个星期后,他们回信并表示他们已经在v2.6中修复了它,现在可用了.我似乎无法重现这个问题.不是说我很棒或者什么,但我还是单枪匹马地解决了这个问题.

  2. 如何在Xcode 4.1中调试OpenCL内核?

    我有一些OpenCL内核没有做他们应该做的事情,我很想在Xcode中调试它们.这可能吗?当我在我的内核中使用printf()时,OpenCL编译器总是给我一大堆错误.解决方法将格式字符串转换为constchar*似乎可以解决此问题.这适用于Lion:这有上述错误:

  3. ios – 由于未捕获的异常终止应用程序“Texture Atlas Not Found”

    我创建了一个使用SpriteKit的简单动画项目.它运行良好,没有问题.当我将工作副本中的文件合并时,会出现该错误.以下是控制台中的消息:2013-10-0910:52:14.777MyProject[1550:a0b]*Terminatingappduetouncaughtexception‘TextureAtlasNotFound’,reason:‘TextureAtlasNotFound’我

  4. ios – 在Swift中找不到Double类型的初始化程序

    我想将我从文本字段获取的String值转换为Double值并存储它,但是我继续收到错误,它找不到类型为Double的intializer,该类型接受参数列表类型.如何解决这个问题?解决方法如果你有一个名为temp的String,你应该可以使用转换为Double值.

  5. ios – 将CALayer设置为SCNMaterial的漫反射内容

    过去几天,我一直在互联网上搜索无效.不幸的是,关于这个具体问题的苹果文档是模糊的,没有示例代码可用.什么似乎是你可能会问的问题?我试过玩漫漫的内容变换矩阵,但没有任何修改.我也尝试将UIView的大小调整为256×256,但是并没有修复任何东西.这是图层的代码:编辑甚至更严厉的是,如果我使用以下方式捕获视图的UIImage:并使用它作为弥漫的内容…一切工作完全正常吗?这是真的很奇怪和令人沮丧,因为图像的大小是完全一样的uiview的…

  6. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  7. Swift基础篇——可选类型

    可选类型

  8. Swift OS X NSColectonView显示网络列表数据

    运行一下现在按照API返回的数量超过5个,实际上这是可以滚动的。所以解析的时候只对前五个赋值即可。

  9. (Swift+iOS)字符串轨迹转贝塞尔曲线,实现动态写字效果

    前两天下载了一个Swift的HUD提示效果,偶然发现其中的提示效果上面的文字是动态书写的。

  10. 六种语言实现输出乘法口诀表

    六种语言实现输出乘法口诀表Objective-cC语言javaJavaScriptSwiftPython可以看出不同语言又不同的写法,从上到下,代码越来越少,越来越简洁,也能够看出这些语言的各自的一些特点。

随机推荐

  1. 从C到C#的zlib(如何将byte []转换为流并将流转换为byte [])

    我的任务是使用zlib解压缩数据包(已接收),然后使用算法从数据中生成图片好消息是我在C中有代码,但任务是在C#中完成C我正在尝试使用zlib.NET,但所有演示都有该代码进行解压缩(C#)我的问题:我不想在解压缩后保存文件,因为我必须使用C代码中显示的算法.如何将byte[]数组转换为类似于C#zlib代码中的流来解压缩数据然后如何将流转换回字节数组?

  2. 为什么C标准使用不确定的变量未定义?

    垃圾价值存储在哪里,为什么目的?解决方法由于效率原因,C选择不将变量初始化为某些自动值.为了初始化这些数据,必须添加指令.以下是一个例子:产生:虽然这段代码:产生:你可以看到,一个完整的额外的指令用来移动1到x.这对于嵌入式系统来说至关重要.

  3. 如何使用命名管道从c调用WCF方法?

    更新:通过协议here,我无法弄清楚未知的信封记录.我在网上找不到任何例子.原版的:我有以下WCF服务我输出添加5行,所以我知道服务器是否处理了请求与否.我有一个.NET客户端,我曾经测试这一切,一切正常工作预期.现在我想为这个做一个非托管的C客户端.我想出了如何得到管道的名称,并写信给它.我从here下载了协议我可以写信给管道,但我看不懂.每当我尝试读取它,我得到一个ERROR_broKEN_P

  4. “这”是否保证指向C中的对象的开始?

    我想使用fwrite将一个对象写入顺序文件.班级就像当我将一个对象写入文件时.我正在游荡,我可以使用fwrite(this,sizeof(int),2,fo)写入前两个整数.问题是:这是否保证指向对象数据的开始,即使对象的最开始可能存在虚拟表.所以上面的操作是安全的.解决方法这提供了对象的地址,这不一定是第一个成员的地址.唯一的例外是所谓的标准布局类型.从C11标准:(9.2/20)Apointe

  5. c – 编译单元之间共享的全局const对象

    当我声明并初始化一个const对象时.两个cpp文件包含此标头.和当我构建解决方案时,没有链接错误,你会得到什么如果g_Const是一个非const基本类型!PrintInUnit1()和PrintInUnit2()表明在两个编译单元中有两个独立的“g_Const”具有不同的地址,为什么?

  6. 什么是C名称查找在这里? (&amp;GCC对吗?)

    为什么在第三个变体找到func,但是在实例化的时候,原始变体中不合格查找找不到func?解决方法一般规则是,任何不在模板定义上下文中的内容只能通过ADL来获取.换句话说,正常的不合格查找仅在模板定义上下文中执行.因为在定义中间语句时没有声明func,并且func不在与ns::type相关联的命名空间中,所以代码形式不正确.

  7. c – 在输出参数中使用auto

    有没有办法在这种情况下使用auto关键字:当然,不可能知道什么类型的.因此,解决方案应该是以某种方式将它们合并为一个句子.这可用吗?解决方法看起来您希望默认初始化给定函数期望作为参数的类型的对象.您无法使用auto执行此操作,但您可以编写一个特征来提取函数所需的类型,然后使用它来声明您的变量:然后你就像这样使用它:当然,只要你重载函数,这一切都会失败.

  8. 在C中说“推动一切浮动”的确定性方式

    鉴于我更喜欢将程序中的数字保留为int或任何内容,那么使用这些数字的浮点数等效的任意算术最方便的方法是什么?说,我有我想写通过将转换放在解析的运算符树叶中,无需将表达式转化为混乱是否可以使用C风格的宏?应该用新的类和重载操作符完成吗?解决方法这是一个非常复杂的表达.更好地给它一个名字:现在当您使用整数参数调用它时,由于参数的类型为double,因此使用常规的算术转换将参数转换为double用C11lambda……

  9. objective-c – 如何获取未知大小的NSArray的第一个X元素?

    在objectiveC中,我有一个NSArray,我们称之为NSArray*largeArray,我想要获得一个新的NSArray*smallArray,只有第一个x对象…

  10. c – Setprecision是混乱

    我只是想问一下setprecision,因为我有点困惑.这里是代码:其中x=以下:方程的左边是x的值.1.105=1.10应为1.111.115=1.11应为1.121.125=1.12应为1.131.135=1.14是正确的1.145=1.15也正确但如果x是:2.115=2.12是正确的2.125=2.12应为2.13所以为什么在一定的价值是正确的,但有时是错误的?请启发我谢谢解决方法没有理由期望使用浮点系统可以正确地表示您的帖子中的任何常量.因此,一旦将它们存储在一个双变量中,那么你所拥有的确切的一

返回
顶部