簡體   English   中英

unsigned long long int 奇怪的行為

[英]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 字節的系統):

  1. [[03 00 00 00] (unsigned long int) [3.0] (float)]一切都是正確的,你打印兩個 4 字節的值。
  2. [[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM