酷酷的金鱼 · 【架构师面试-云原生-2】-云原生面试之Ku ...· 1 月前 · |
没读研的鸡蛋面 · WPF中应用华为鸿蒙字体 - 知乎· 1 年前 · |
个性的大白菜 · Android Crash之Java ...· 1 年前 · |
行走的长颈鹿 · 淘宝开放平台 - 文档中心· 1 年前 · |
#include <stdio.h>
int main() {
unsigned long long int num = 285212672; //FYI: fits in 29 bits
int normalInt = 5;
printf("My number is %d bytes wide and its value is %ul. A normal number is %d.\n", sizeof(num), num, normalInt);
return 0;
}
输出:
My number is 8 bytes wide and its value is 285212672l. A normal number is 0.
我假设这个意外的结果是由于打印
unsigned long long int
造成的。How do you
printf()
an
unsigned long long int
将ll (el-el) long-long修饰符与u(无符号)转换一起使用。(适用于windows、GNU)。
printf("%llu", 285212672);
非标准的东西总是很奇怪:)
在GNU下,长长的部分是
L
、
ll
或
q
在windows下,我相信它只有
ll
一种方法是使用VS2008将其编译为x64
这将按照您的预期运行:
int normalInt = 5;
unsigned long long int num=285212672;
printf(
"My number is %d bytes wide and its value is %ul.
A normal number is %d \n",
sizeof(num),
normalInt);
对于32位代码,我们需要使用正确的__int64格式说明符%I64u。所以它变成了。
int normalInt = 5;
unsigned __int64 num=285212672;
printf(
"My number is %d bytes wide and its value is %I64u.
A normal number is %d",
sizeof(num),
num, normalInt);
此代码适用于32位和64位VS编译器。
您可能希望尝试使用为您提供
int32_t
、
int64_t
、
uint64_t
等类型的inttypes.h库。然后,您可以使用其宏,例如:
uint64_t x;
uint32_t y;
printf("x: %"PRId64", y: %"PRId32"\n", x, y);
这“保证”不会给你带来与
long
、
unsigned long long
等相同的麻烦,因为你不必猜测每种数据类型有多少位。
这是因为%llu在Windows下无法正常工作,并且%d无法处理64位整数。我建议使用PRIu64,你会发现它也可以移植到Linux上。
试着这样做:
#include <stdio.h>
#include <inttypes.h>
int main() {
unsigned long long int num = 285212672; //FYI: fits in 29 bits
int normalInt = 5;
/* NOTE: PRIu64 is a preprocessor macro and thus should go outside the quoted string. */