在一个相关的问题之后,我想问一下C++ 11中的新字符和字符串文字类型.看来我们现在有四种字符和五种字符串文字.角色类型:
char a = '\x30'; // character, no semantics
wchar_t b = L'\xFFEF'; // wide character, no semantics
char16_t c = u'\u00F6'; // 16-bit, assumed UTF16?
char32_t d = U'\U0010FFFF'; // 32-bit, assumed UCS-4
Run Code Online (Sandbox Code Playgroud)
和字符串文字:
char A[] = "Hello\x0A"; // byte string, "narrow encoding"
wchar_t B[] = L"Hell\xF6\x0A"; // wide string, impl-def'd encoding
char16_t C[] = u"Hell\u00F6"; // (1)
char32_t D[] = U"Hell\U000000F6\U0010FFFF"; // (2)
auto E[] = u8"\u00F6\U0010FFFF"; // (3)
Run Code Online (Sandbox Code Playgroud)
问题是:\x/ \u/ \U …
例如,我printf在C++中使用函数用于8位CPU(AVR).以下代码是否安全:
uint8_t a = 5;
printf("%d", a);
Run Code Online (Sandbox Code Playgroud)
这里%d期望int(在我的情况下为16位,在任何情况下至少为16位),但我传递8位整数.
C/C++标准是否保证任何类型的等级小于int升级int?
同样的问题float a和%f期望double,以及其他类似的类型.
我的问题源于在尝试构建多个位深度平台(例如32/64)时尝试使用printf来记录事物.
一直在养成丑陋头脑的问题是试图在多种体系结构上打印.在32位上它会是这样的
printf(" my int: %d\n", myInt);
Run Code Online (Sandbox Code Playgroud)
但在64位上,它必须改为
print (" my int: %ld\n", (long)myInt);
Run Code Online (Sandbox Code Playgroud)
我有两个相关的问题:
我的第一个想法是,当你告诉printf打印一个变量,给它一个格式时,它会查看该变量的地址并获取该格式所需的字节数.这一开始似乎是个大问题.例如,如果你有一个变量myChar,它是一个char(1个字节),但使用了%d的格式说明符,那将告诉printf转到myChar的地址并获取接下来的4个字节,将其视为int.如果是这种情况,似乎printf会从相邻变量中获取垃圾日期(因为它抓取了4个字节,但实际值只有1个字节).然而,情况似乎并非如此.通过使用myChar并指定%d,printf抓取1个字节,然后用0表示填充高3个字节.我的理解在这里是否正确?
如果上述情况属实,那么始终将变量提升到最大值是否有任何真正的危害,以避免在32/64位情况下出现的问题类型.例如,如果你有一个短变量myShort和一个int变量myInt,那么打印它们总是有任何缺点:
printf("myShort%ld",(long)myShort); printf("myInt%ld",(long)myInt);
谢谢你的任何澄清.
例如,以下代码在编译时返回错误和警告int,更改为%d
警告:格式
%s需要 type 的char *参数,但参数 2 具有类型int
void stringd() {
char *s = "Hello";
printf("derefernced s is %s", *s);
}
Run Code Online (Sandbox Code Playgroud)