i**p 发帖数: 902 | 1 哪位大牛能解释一下ullong 1, ullong 2, ullong 4, ullong 5 的输出吗?
此程序在 Android (GB) emulator 上运行。
//刚刚发现,程序中的反斜杠都被mitbbs过滤掉了。
printf("sizeof(unsigned int): %dn", sizeof(unsigned int));
printf("sizeof(unsigned long): %dn", sizeof(unsigned long));
printf("sizeof(unsigned long long): %dn", sizeof(unsigned long long));
unsigned int uint=0x01020304;
printf("uint: 0x%xn", uint);
unsigned long ulong=0x01020304;
printf("ulong 1: 0x%xn", ulong);
printf("ulong 2: 0x%lxn", ulong);
unsigned long long ullong=0x0102030405060708;
printf("ullong 1: 0x%xn", ullong);
printf("ullong 2: 0x%lxn", ullong);
printf("ullong 3: 0x%llxn", ullong);
ullong=0;
printf("ullong 4: 0x%xn", ullong);
printf("ullong 5: 0x%lxn", ullong);
printf("ullong 6: 0x%llxn", ullong);
output from Android Emulator.
sizeof(unsigned int): 4
sizeof(unsigned long): 4
sizeof(unsigned long long): 8
uint: 0x1020304
ulong 1: 0x1020304
ulong 2: 0x1020304
ullong 1: 0x8c48
ullong 2: 0x8c58
ullong 3: 0x102030405060708
ullong 4: 0x8c79
ullong 5: 0x8c8b
ullong 6: 0x0
这是在Ubuntu上的运行结果
sizeof(unsigned int): 4
sizeof(unsigned long): 8
sizeof(unsigned long long): 8
uint: 0x1020304
ulong 1: 0x1020304
ulong 2: 0x1020304
ullong 1: 0x5060708
ullong 2: 0x102030405060708
ullong 3: 0x102030405060708
ullong 4: 0x0
ullong 5: 0x0
ullong 6: 0x0 | d****i 发帖数: 4809 | 2 I guess the difference in sizeof(long) on Android and Ubuntu is because
Android is a 32-bit OS and ARM is 32-bit architecture. Therefore, gcc-arm-
linux will treat long as 32-bit instead of 64-bit. While I guess your Ubuntu
is 64-bit version, therefore gcc will treat long as 8 bit.
【在 i**p 的大作中提到】 : 哪位大牛能解释一下ullong 1, ullong 2, ullong 4, ullong 5 的输出吗? : 此程序在 Android (GB) emulator 上运行。 : //刚刚发现,程序中的反斜杠都被mitbbs过滤掉了。 : printf("sizeof(unsigned int): %dn", sizeof(unsigned int)); : printf("sizeof(unsigned long): %dn", sizeof(unsigned long)); : printf("sizeof(unsigned long long): %dn", sizeof(unsigned long long)); : unsigned int uint=0x01020304; : printf("uint: 0x%xn", uint); : unsigned long ulong=0x01020304; : printf("ulong 1: 0x%xn", ulong);
| d****n 发帖数: 1241 | 3 C99 n1256: 7.19.6.1 第9项:
"If any argument is not the correct type for the corresponding conversion
specification, the behavior is undefined"
好奇一下,为什么要用“%x“打印一个unsigned long long呢?一般而言,尽量不要在
C代码里尝试C的这些corner cases。有时候,个人感觉是对的,但是实际上标准里规定
是ub,或者在某些很极端的情况下,标准也是有点含糊(或者有矛盾的)的,例如对于
union的一些操作。。。
【在 i**p 的大作中提到】 : 哪位大牛能解释一下ullong 1, ullong 2, ullong 4, ullong 5 的输出吗? : 此程序在 Android (GB) emulator 上运行。 : //刚刚发现,程序中的反斜杠都被mitbbs过滤掉了。 : printf("sizeof(unsigned int): %dn", sizeof(unsigned int)); : printf("sizeof(unsigned long): %dn", sizeof(unsigned long)); : printf("sizeof(unsigned long long): %dn", sizeof(unsigned long long)); : unsigned int uint=0x01020304; : printf("uint: 0x%xn", uint); : unsigned long ulong=0x01020304; : printf("ulong 1: 0x%xn", ulong);
| d****n 发帖数: 1241 | 4 c99标准规定sizeof(int_type)是implementation defined的。
但是我感觉他问的不是sizeof(...)输出的差别
Ubuntu
【在 d****i 的大作中提到】 : I guess the difference in sizeof(long) on Android and Ubuntu is because : Android is a 32-bit OS and ARM is 32-bit architecture. Therefore, gcc-arm- : linux will treat long as 32-bit instead of 64-bit. While I guess your Ubuntu : is 64-bit version, therefore gcc will treat long as 8 bit.
| t****t 发帖数: 6806 | 5 知道是undefined就可以了, 具体错成什么样, 跟ABI有关.
【在 d****n 的大作中提到】 : C99 n1256: 7.19.6.1 第9项: : "If any argument is not the correct type for the corresponding conversion : specification, the behavior is undefined" : 好奇一下,为什么要用“%x“打印一个unsigned long long呢?一般而言,尽量不要在 : C代码里尝试C的这些corner cases。有时候,个人感觉是对的,但是实际上标准里规定 : 是ub,或者在某些很极端的情况下,标准也是有点含糊(或者有矛盾的)的,例如对于 : union的一些操作。。。
| d****n 发帖数: 1241 | 6 我只是很好奇为什么楼主要测试这样的代码:)
对于UB,根据标准教条一点的说,跟ABI没有关系,编译器做任意的事情都是“正确”的
【在 t****t 的大作中提到】 : 知道是undefined就可以了, 具体错成什么样, 跟ABI有关.
| i**p 发帖数: 902 | 7 不是要测试这样的代码,是好奇这几个值是怎么来的。
ullong 1: 0x8c48
ullong 2: 0x8c58
ullong 4: 0x8c79
ullong 5: 0x8c8b
”的
【在 d****n 的大作中提到】 : 我只是很好奇为什么楼主要测试这样的代码:) : 对于UB,根据标准教条一点的说,跟ABI没有关系,编译器做任意的事情都是“正确”的
| t****t 发帖数: 6806 | 8 不是说了跟ABI有关系么...
【在 i**p 的大作中提到】 : 不是要测试这样的代码,是好奇这几个值是怎么来的。 : ullong 1: 0x8c48 : ullong 2: 0x8c58 : ullong 4: 0x8c79 : ullong 5: 0x8c8b : : ”的
| i**p 发帖数: 902 | 9 我是在回答daikon 为什么楼主要测试这样的代码。。。
【在 t****t 的大作中提到】 : 不是说了跟ABI有关系么...
| S*A 发帖数: 7142 | 10 unsigned long long ullong=0x0102030405060708;
这个写法是不太好的,
应该是:
unsigned long long ullong=0x0102030405060708LL;
不然那个长的 constant 有可能被编译器截短。 |
|