[英]unsigned long long int strange behaviour
此 C 代碼
unsigned long int a, b, x;
float c, d, y;
a = 6;
b = 2;
x = a/b;
c = 6.0;
d = 2.0;
y = c/d;
printf("\n x: %d \n y: %f \n",x,y);
工作正常並打印出來
x: 3
y: 3.000000
但是,當我將第一行更改為此
unsigned long long int a, b, x;
我得到這個 output:
x: 3
y: 0.000000
這真的讓我感到困惑......我沒有用 c,d 和 y 改變任何東西 - 為什么我會得到這個? 我在 linux 上使用 gcc
對於后一種用途:
printf("\n x: %llu \n y: %f \n",x,y);
將u
用於無符號積分(您的 output 僅是正確的,因為您使用了較小的值)。 對 long long 使用ll
修飾符,否則 printf 將使用錯誤的大小來解碼 printf 的第二個參數 (x),因此它使用錯誤的地址來獲取 y。
你應該使用:
printf("\n x: %llu \n y: %f \n", x, y);
否則會發生這樣的事情(例如對於unsigned long int
為 4 字節, unsigned long long int
為 8 字節, float
為 4 字節的系統):
[[03 00 00 00] (unsigned long int) [3.0] (float)]
一切都是正確的,你打印兩個 4 字節的值。[[03 00 00 00 00 00 00 00] (unsigned long long int) [3.0] (float)]
在這里,您打印兩個 4 打印值,但實際上在您的printf
收到的緩沖區中有一個 8 字節值和一個4 字節值,因此您只打印前 8 個字節:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.